赞
踩
数据结构练习:大话数据结构 殷人昆c++ 剑指offer和程序员代码面试指南 leetcode 牛客
数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合
算法就是定义良好的计算过程,取一个或一组的值为输入,并产生出一个或一组值作为输出。
1.时间复杂度
时间复杂度主要衡量一个算法运行快慢
算法的时间复杂度是一个函数(数学中带未知数函数式)
算法中的基本操作执行次数,为算法的时间复杂度
1.1大O渐进表示法
①用常数1取代运行时间中的所有加法常数(O(1)代表常数次)
②在修改后的运行次函数中,只保留最高阶项
③如果最高阶项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶
实例:
1.计算二分查找(有序)的时间复杂度(O(logN))
- int BinarySearch(int * a , int n , int x)
- {
- assert(a);
-
- int begin = 0;
- int end = n-1;
- //[begin, end]:begin 和 end 是左闭右闭区间
- while(begin <= end)
- {
- int mid = begin + (end - begin)>>1);
- if(a[mid] < x)
- begin = mid + 1;
- else if(a[mid]>x)
- end = mid -1;
- else
- return mid;
- }
-
- return -1;
-
- }
每次查找,查找区间缩小一半,查找多少次,除2多少次
N / 2/2/2/2... = 1
假设查找了x次,N = 1*2*2*2*2 *...2(x个2) 即N = 2^x x = logN
2.计算阶乘递归Fac的时间复杂度
- long long Fac(size_t N)
- {
- if(0 == N)
- return 1;
-
- return Fac(N-1)*N;
-
- }
Fac(N)调用Fac(N-1); Fac(N-1)调用Fac(N-2)...
递归了N次,每次调用里面执行2个操作 ---> 2N O(N)
size_t --- typedef unsigned int
3.
- long long Fac(size_t N)
- {
- if(0 == N)
- return 1;
-
- for(size_t i = 0; i < N ; i++)
- {
- ...
-
- }
-
- return Fac(N-1)*N;
- }
Fac(N) --- 1+N+1 = N+2
Fac(N-1) --- 1+N-1+1 = N+1
....
Fac(1) --- 1+1+1 = 3
时间复杂度:N+2 + N+1 +.... +3 == NxN = N^2
4.计算斐波那契递归Fib的时间复杂度
- long long Fib(size_t N)
- {
-
- if(N < 3)
- return 1;
-
- return Fib(N-1)+Fib(N-2);
- }
时间复杂度: 2^N
2.空间复杂度
空间复杂度主要衡量一个算法运行所需要的额外空间
计算开了变量的个数
面试题 17.04 消失的数字
数组nums包含从0到N的所有整数,但其中缺了一个,请找出缺失的整数,时间复杂度限制O(N)
例:
输入:【3,0,1】
输出:2
分析思路,用复杂度分析优缺点,实现最优
思路1: 求和相减 (n+1)*n/2-(a[0]+a[1]+...)
时间复杂度:O(N)
空间复杂度:O(1)
思路2:排序 qsort
[0,1,3]
判断后面的数是否等于前一个数加一
时间复杂度:O(N*logN+N)
空间复杂度:O(logN)
思路3:异或 相异为1 相同为0
a^a = 0;
a^0 = a;
a^b = b^a;
例:输入 【9,6,4,2,3,5,7,0,1】
输出:8
具体操作:
1.创建一个新数组0-9都有,两个数组的值异或,挑出来8
时间复杂度:O(N) 空间复杂度:O(1)
2.不开辟新数组 用一个循环 创建一个变量j j++ j从0加到9 和数组中的值异或
int x = 0;
//0和数组中的所有数异或 == 数组中的数
for(i = 0; i<numsSize; ++i)
{
x ^= nums[i];
}
for(j = 0; j<N+1; ++j)
{
x ^= j;
}
return x;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。