随GCTY
1.用常数1来取代运行时间中所有加法常数。
2.修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。
如果sum = (1+n)*n/2这条语句再执行10遍,
因为这与问题大小n的值并没有关系,所以这个算法的时间复杂度仍旧是O(1),我们可以称之为常数阶
https://www.jianshu.com/p/f4cca5ce055a
ElemType是数据结构的书上为了说明问题而用的一个词。它是element type(“元素的类型”)的简化体
给小灰一条长16寸的面包,小灰每5天吃掉面包剩余长度的一半,第一次吃掉8寸,第二次吃掉4寸,第三次吃掉2寸...
...那么小灰把面包吃得只剩下1寸,需要多少天呢?
这个问题翻译一下,就是数字16不断地除以2,除几次以后的结果等于1?这里要涉及到数学当中的对数,
以2位底,16的对数,可以简写为log16。
因此,把面包吃得只剩下1寸,需要 5 X log16 = 5 X 4 = 20 天
十进制数N和其他d进制数的转换基于下列原理:
N = (N div d)×d + N mod d (div 为整除,mod为求余)
有n个元素依次进栈,则出栈序列有多少种:https://blog.csdn.net/sakyaer/article/details/28926751
https://blog.csdn.net/rainchxy/article/details/78189472
顺序队列是队列的顺序存储结构由于队列的队头和队尾的位置是变化的,
设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应设置为0。
试比较顺序存储结构和链式储蓄结构的优缺点
链式存储结构:
(1)占用额外的空间以存储指针(浪费空间)
(2)存取某个元素速度慢
(3)插入元素和删除元素速度快
(4)没有空间限制,存储元素的个数无上限,基本只与内存空间大小有关.
顺序存储结构:
(1)空间利用率高
(2)存取某个元素速度快
(3)插入元素和删除元素存在元素移动,速度慢,耗时
(4)有空间限制,当需要存取的元素个数可能多于顺序表的元素个数时,会出现"溢出"问题.当元素个数远少于预先分配的空间时,空间浪费巨大.
在存取元素频繁,但删除或插入操作较少的情况宜用顺序表.堆排序,二分查找适宜用顺序表.
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,
进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
一般队列的存储结构是顺序存储,当队列的存储结构是链式存储结构时
(即队列中每个元素都包含一个指向其后继的指针,最后一个元素指针为null),就是链式队列,和链栈同理。
双端队列 分类:输出受限的双端队列(允许在一端进行插入和删除,但在另一端只允许插入的双端队列称为输出受限的双端队列)
输入受限的双端队列(允许在一端进行插入和删除,但在另一端只允许删除的双端队列称为输入受限的双端队列)
c++ c语言都可以连等
typedef struct Node{ int elem; struct node * next; }node,*LinkList;
对于LinkList L: L是指向定义的node结构体的指针,可以用->运算符来访问结构体成员,即L->elem, 而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem;
对于LinkList *L: L是指向定义的Node结构体指针的指针,所以(*L)是指向Node结构体的指针,可以用->运算符来访问结构体成员,即(*L)->elem,当然,(**L)就是Node型结构体了,所以可以用点运算符来访问结构体成员,即(**L).elem;
1.二分查找的时间复杂度
假使总共有n个元素,那么二分后每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。
最坏的情况是K次二分之后,每个区间的大小为1,找到想要的元素
令n/2^k=1,
可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn).
前缀中缀后缀表达式:https://www.cnblogs.com/chensongxian/p/7059802.html
return; 不带返回值的return语句只能用于返回类型为void的函数