算法:
数据结构中的算法,指的是数据结构所具备的功能
解决特定问题的方法,它是前辈们的一些优秀的经验总结
一个算法应该具有以下五个重要的特征:
有穷性:算法的有穷性
确切性:算法的每一步骤必须又确切的定义;
输入项: 一个算法有0个或多个输入;
输出项:
可行性:
如何评价一个算法:
时间复杂度:由于计算机的性能不同,无法准确地衡量出算法执行所需要地时间
因此我们用算法的执行次数来代表算法的时间负责度
一般使用 O(公式) 一般忽略常数
常见的时间复杂度:
// O(1)
printf("%d",i);
// O(logn)
for(int i=n; i>=0; i/=2)
{
printf("%d",i);
}
// O(n) O(N)
for(int i=0; i<10; i++)
{
printf("%d",i);
}
// O(nlogn)
for(int i=0; i<10; i++)
{
for(int j=n; j>=0; j/=2)
{
printf("%d",i);
}
}
// O(n^2)
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
printf("%d",i);
}
}
空间复杂度:
执行一个程序所需要的内存空间大小,是对一个算法在运行过程中临时占用存储空间大小的衡量
一般只要算法不涉及动态分配的内存以及递归,通常空间复杂度为O(1)
例如: 求第n个斐波那数列的递归实现算法 空间复杂度O(n)
注意:对于一个算法而言,其时间复杂度与空间复杂度往往是相互影响的,没有唯一的标准,需要结合实际综合考虑
分治:
分而治之,把一个大而复杂的问题,分解成很多小而简单的问题
用计算机强大的计算能力来解决问题
实现分治的方法:循环、递归
查找算法:
顺序查找
对待查找的数据没有要求,从头到尾逐一比较,在校规模的查找中较为常见,查找效率较低
时间复杂度: O(n)
二分查找(折半查找)
带查找的数据必须有序,从数据中间位置开始比较查找,如果中间值比key小,则左边继续经行二分查找,反之从右边进行。
时间复杂度: O(logN)
块查找(权重查找)
是一种数据处理的思想,不是一种特定的算法,当数据量非常多时,可以先把数据先分块处理
然后再根据分块的条件进行查找,例如英文字典
哈希查找