算法知识点
算法的特征
算法有四大特征
1. 确定性:算法的每个步骤都是明确的,对结果的预期也是确定的。
2. 有穷性:算法必须由有限个步骤组成,必须有一个确定的结束条件。
3. 可行性:算法额每一个步骤都是可行的,只要一个步骤不行算法就是失败的。
4. 输入和输出:算法是要解决特定的问题,问题来源就是算法的输入,期望结果就是算法的输出。
算法的定义
算法是为了解决一个特定的问题而精心设计的一套数学模型以及在这套数学模型上的一系列操作步骤,
这些操作步骤将问题描述的输入数据逐步处理、转换,并最后得到一个确定的结果。
时间复杂度
时间频度
一个算法中的语句执行次数成为语句频度或时间频度。记作T(n)
时间复杂度
n称为问题的规模,n不断变化,T(n)也不断变化,时间复杂度就是变化时呈现的规律。
算法中执行次数是T(n),若有某个辅助函数f(n),使得n趋近于无限大时,T(n)/f(n)的极限值不等于零的常数,称fn(n)是T(n)的同数量级函数。
记作T(n)=O(f(n)),称O(f(n))为时间复杂度。例如:O(n^2)
按数量级递增排列,常见的时间复杂度:
常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),
平方阶O(n^2),立方阶O(n^3),k方阶O(n^k),指数阶O(2^n)
log
log10100相当于问10的多少次方等于100。答案是2,因为10*10=100。
这里使用的是大O表示法讨论运行时间时,log指的都是log2。如果列表包含8个数字,使用二分查找,最多需要检查logn个元素。也就是log8=3。
记录一下log,举个例子:for(int j=1;j<n;j*=2)。这个循环的时间复杂度是:O(log2n)
j每循环一次乘以2;j初始化为1,循环x后为j=2^x;j>n时循环停止,2^x>n,此时x=log2n
线性表
数据结构中最简单的基本数据结构就是线性表。最常见的线性表有四种:数组、链表、栈、队列
数组
一种相对比较简单的数据关系,所有数据存放在一片连续区域内。通过下标访问数组元素,可以进行插入、删除查找
数组直接访问没有开销,插入和删除操作需要移动数组元素,开销比较大。
因此在插入和删除操作比较频繁场合下,不适合使用数组。
数组中查找一个元素的时间复杂度是O(n),如果数组是有序的,使用二分查找,可以将时间复杂度降为O(logn)
链表
在长度不能确定的场合,一般采用链表的形式。链表有两部分组成,1存放实体数据,2.指针指向
单链表,指针指向后方。双链表,是由前后指针两个组成的。
链表的插入和删除,只需要修改指针指向即可完成。比数组的插入和删除效果高。
但是查询效率很低,需要从头到尾部遍历,时间复杂度是O(n)
可以将链表尾部节点的向后指针,指向链表头部节点,构成环形链表。从任何一个节点开始都可以遍历整个链表。
对于一些插入和删除操作比较少,查找、遍历操作比较多的场合,应优先选择可变长数组替代链表。
栈
栈是一种特殊的线性表,只能在表的一端插入和删除数组元素,分别称为:入栈,出栈。遵循后入先出原则
队列
一种特殊的线性表,普通的队列只能在表的一端插入数据,在另一端删除数据,不能再其他地方插入和删除。
插入和删除动作,分别成为“入队”和“出队”。遵循先进先出原则
#