王道考研 数据结构(图片链接失效)

本文详细介绍了数据结构的基础概念,包括顺序结构、链式结构、索引存储和散列存储。同时,讨论了数据类型的原子结构和结构类型。重点分析了算法的时间复杂度,通过实例解释了如何计算复杂度,并对比了不同算法的执行次数。文章还探讨了a、b、c三个具体算法的时间复杂度,揭示了O(N)级别算法的实际执行差异。
摘要由CSDN通过智能技术生成

数据结构:

数据结构、操作系统、计算机网络

image-20210811090311763

数据是信息的载体

数据结构是相互之间存在的一种或者多种的关系的数据元素的集合

数据对象是具有相同性质的数据元素的集合,是数据的一个子集

顺序结构:逻辑上响铃的元素存储在物理位置上也相邻的存储单元,元素之间的关系由存储单元的领接关系来体现

链式结构:逻辑上相邻的元素在物理地址上可以不相邻,借助指示元素存储地址的指针来标识元素之间的逻辑关系

索引存储:存储信息元素的同时,建立附加的索引表,索引表的每项成为索引项(关键字,地址)

散列存储:计算得出结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]

算法的特性:有穷行、确定性、可行性、输入、输出、正确性、可读性、健壮性

image-20210811091913752

时间复杂度 空间复杂度

时间复杂度:只考虑阶数高的部分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]

image-20210811093136992

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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−21​1−(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值