1.数据结构概述
1.1何为数据结构?
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。通俗的理解数据结构就是为我们储存数据并展示数据之间的特定关系,操作数据,提供的一种容器。
1.2数据结构三要素
1.数据的逻辑结构
(1)线性结构(数据元素之间只存在一对一的关系):线性表 栈 队列
(2)非线性结构: 树(一对多) 图(多对多) 集合(集合中的数据元素除同属一个集合外,别无其它关系)
2.数据的存储结构(物理结构)
(1)顺序存储:逻辑上相邻的元素存储在物理位置上也相邻的存储单元中
(2)链式存储:不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系
(3)索引存储:在存储元素信息的同时,还建立附加的索引表
(4)散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希存储
3.数据的运算
2.算法的时间复杂度和空间复杂度
2.1.算法效率
算法效率是由时间复杂度和空间复杂度来衡量的
2.2时间复杂度
在计算机科学中,算法的时间复杂度是一个函数,他定量描述了该算法的运行时间。
2.2.1 大O的渐进表示法
2.2.2易错题:
1.二分查找时间复杂度分析:
通过将目标值与排序数列中值的比较,一下可以排除一半的元素
最好为一次,最坏为O(logN),时间复杂度为log(N)
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.阶乘时间复杂度分析
long long Fac(size_t N)
{
if(0 == N)
return 1;
return Fac(N-1)*N;
}
执行N次,时间复杂度为O(N)
3.计算斐波那契数列时间复杂度
long long Fib(size_t N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}
F(N)=1+2+2^1+2^2+……+2^(n-2)
时间复杂度为O(2^N)
4.
int m=0,i,j;
for(i=1;i<=n;i++)
for(j=1;j<=2*i;j++)
m++;
n=1时,内层循环执行2次
n=2时,内层循环执行4次
……
n时,内层循环执行为2n次
F(N)=2+4+6+8+……+2n=n(n+1)
O(N^2)
5.
int func(int n)
{
int i=0,sum=0;
while(sum<n)
sum += ++i;
return i;
}
设一共执行x次
第一次:sum += 1 , sum=1,i=1;
第二次:sum += 2 , sum=1+2,i=2;
……
第x次:sum +=x , sum=1+2+3+...+x = n
解得 x=n^1/2
6.
int sum=0;
for(int i=1;i<n;i*=2)
for(int j=0;j<i;j++)
sum++;
T=1+2+4+……+x
共logn项
由等比数列求和得 n-1次
O(N)