数据结构:
数据结构、操作系统、计算机网络
数据是信息的载体
数据结构是相互之间存在的一种或者多种的关系的数据元素的集合
数据对象是具有相同性质的数据元素的集合,是数据的一个子集
顺序结构:逻辑上响铃的元素存储在物理位置上也相邻的存储单元,元素之间的关系由存储单元的领接关系来体现
链式结构:逻辑上相邻的元素在物理地址上可以不相邻,借助指示元素存储地址的指针来标识元素之间的逻辑关系
索引存储:存储信息元素的同时,建立附加的索引表,索引表的每项成为索引项(关键字,地址)
散列存储:计算得出结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-avIJb3HT-1628814826526)(https://raw.githubusercontent.com/liuzheng2000/PicGo/main/20210813082633.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0XPpJVaL-1628814826529)(https://raw.githubusercontent.com/liuzheng2000/PicGo/main/20210813083256.png)]
数据类型:原子结构,结构类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RhthUKzU-1628814826529)(https://raw.githubusercontent.com/liuzheng2000/PicGo/main/20210813082638.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oog3OFTa-1628814826530)(https://raw.githubusercontent.com/liuzheng2000/PicGo/main/20210813083302.png)]
算法的特性:有穷行、确定性、可行性、输入、输出、正确性、可读性、健壮性
时间复杂度 空间复杂度
时间复杂度:只考虑阶数高的部分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MywzCLc5-1628814826532)(https://raw.githubusercontent.com/liuzheng2000/PicGo/main/20210813082659.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nou3wMYH-1628814826533)(https://raw.githubusercontent.com/liuzheng2000/PicGo/main/20210813083322.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kkhv9qSm-1628814826534)(https://raw.githubusercontent.com/liuzheng2000/PicGo/main/20210813083309.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smMswdmi-1628814826535)(https://raw.githubusercontent.com/liuzheng2000/PicGo/main/20210813083314.png)]
a:
public static void fa(int N) {
int sum = 0;
for (int n = N; n > 0; n /= 2) {
for (int i = 0; i < n; i++) {
sum++;
}
}
System.out.println(sum);
}
b:
public static void fb(int N) {
int sum = 0;
for (int i = 1; i < N; i *= 2) {
for (int j = 0; j < i; j++) {
sum++;
}
}
System.out.println(sum);
}
c:
public static void fc(int N) {
int sum = 0;
for (int i = 1; i < N; i *= 2) {
for (int j = 0; j < N; j++) {
sum++;
}
}
System.out.println(sum);
}
答案和做法
a小题
如果按照通常的方法,分析for有多少个,那么分析起来会很痛苦,外层循环是 O ( l o g N ) O(logN) O(logN)的操作很容易看出来,但是第二个for,i和n是挂钩的,这个时候通常的方法就不起作用了。
换一种思路,先写一下sum++操作的运行次数
N N/2 N/4 ... 1 ,这实际上是一个等比为2的等比数列,我们把这个数列记为L,它的项数为n
注意到第n项等于1,而L的首项是N,那么 1 = N ∗ 2 1 − n 1=N*2^{1-n} 1=N∗21−n,得出 n = l o g 2 ( N ) + 1 n=log_2(N)+1 n=log2(N)+1
对L用等比公式求和, S n = N ∗ 1 − ( 1 2 ) n 1 − 1 2 S_n=N*\frac{1-(\frac{1}{2})^n}{1-\frac{1}{2}} Sn=N∗1−211−(21)n = N ( 2 n − 1 ) N(2^n-1) N(2n−1),把n带入,化简即可得到 2 N − 1 2N-1 2N−1
也就是说内循环的总操作次数是2N,那么它其实就是 O ( N ) O(N) O(N)级别的算法
b小题
b小题其实和a小题很相似,只不过b的数列变为
1 2 4 … N,等比为2,同样是n项
n同样等于 l o g 2 ( N ) + 1 log_2(N)+1 log2(N)+1,因为 2 n − 1 = N 2^{n-1}=N 2n−1=N
而L的和 S n = N ∗ 1 − 2 n 1 − 2 S_n=N*\frac{1-2^n}{1-2} Sn=N∗1−21−2n = N ( 2 n − 1 ) = 2 N − 1 N(2^n-1)=2N-1 N(2n−1)=2N−1,
那么b也是 O ( N ) O(N) O(N)级别的算法
c小题
c小题用常规的做法做即可,c是 O ( N l o g N ) O(NlogN) O(NlogN)级别的算法
解释一下a,b同为O(N)级别的算法,为什么它们实际操作次数却不一样,因为O(N)取的是近似值,剩余的较低次项都被忽略了,但是实际计算中低次项的次数同样很关键,因此a,b的执行次数会不一样
参考:
https://github.com/reneargento/algorithms-sedgewick-wayne/issues/9
https://math.stackexchange.com/questions/401937/how-is-nn-2n-4-1-equal-to-2n-1-using-the-formula-for-geometric-series
https://stackoverflow.com/questions/29966730/order-of-growth-of-as-function-of-n
————————————————
版权声明:本文为CSDN博主「hhmy77」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hhmy77/article/details/106750276