声明:以下内容来自于B栈知名up主–白话拆解数据结构
回答:为什么要做这个,因为我这个学期学完了数据结构,而且这个数据结构是408的重头,为什么选择25的,因为这个25考研刚刚结束,25相对成熟,26考验的还刚刚起步,所以选择的是25考研的;
1.数据结构基本概念
数据结构完整的话,是包括我们的这个逻辑关系,存储结构和运算类型;
逻辑关系:这个数据结构的不同部分的元素之间的这个关系;
存储结构:就是在这个计算机内存里面是以什么样的方式进行存储的;
运算:就是加减乘除,排序等等相关的这些操作;
但是题目上面说的是这个什么可以定义这个完整的数据结构,实际上抽象的数据类型就可以定义这个完整的数据结构了(只是表明数据元素之间的这个关系),其实这个就已经可以定义我们的这个数据结构了,这个抽象数据类型的这个英文全称是abstract data type,简称就是ADT,这个我们也可以了解一下;
下面的这个是非线性的结构:我们的这个栈和队列都是典型的这个线性数据结构,但是这个树显然是树状的结构,不属于我们的线性结构;
下面的问的是逻辑结构:我们可以反其道而行之,去看看这个逻辑结构,为什么,因为这个里面的顺序表,链表,单链表都是属于典型的储存结构对把,分别是顺序存储,链式存储,以及这个散列存储(因为这个哈希表也是被称为这个散列表的)还有的存储方式就是索引存储(我觉得这个数组下标索引应该是属于这个类型的存储的方式的);
下面的这个问题:我们的顺序结构独立于存储的结构,但是我们的这个存储的结构不是独立于逻辑结构的,因为我们的这个存储结构需要体现我们的这个元素之间的这个逻辑关系,因此我们的这个存储结构是不独立于逻辑结构的;
我们对于这个数据进行存储的时候,不仅存的这个数据的值,而且要存这个数据的之间的这个逻辑关系;
2.算法和算法评价
我们的这个算法的时间复杂度是O(n2),说明这个算法的执行的时间是和我们的n2成正比的,因为我们的这个时间复杂度进行这个计算的时候,是不考虑这个系数,例如这个2n2或者是其他的带系数的,我们都写作这个n2,因此这个执行的时间复杂度就是和n2成正比,可以是这个n2的倍数,但是不一定完全就是n^2,对于这个问题的规模而言,实际上和规模是n;
下面的空间复杂度:O(1)实际上表示的是常数次,而不是其他的,且这个辅助空间的大小是固定的,和我们的这个问题的规模没有关系;
下面的是:时间复杂度的比较,这个实际上比较的就是我们的这个数量级,显然这个D里面的这个以2为底数的这个时间复杂度的这个量级就是最小的,其实这个nlongn同时出现的时候,这个n就可以直接忽略了,因为和n*logn相比,这个n数量级算是小的;
下面的是代码求解时间复杂度:
我们发现这个循环里面是每一次乘上2,也就是1 2 4 8 16 …n也就是每一次乘上2,2^x=n这个x的求解的结果就是我们的这个执行的次数;
下面的这个是求解时间复杂度:这个实际上就是我们的等差数列的求和公式,最后的这个结果可能并不是严谨的这个1+2+3+…+n,但是就算是缺项,这个对于我们的这个整体的这个数量级的影响也是微乎其微的,因此我们就可以当做n(n^2)看待,但是这个实际上是n(n+1)/2,这个是我们的等差数列的求和的结果的,但是我们说了我们的这个时间复杂度强调的是这个量级,前面的这个系数就省略,就是下面的这个:
n
2
+
n
n^2+n
n2+n
但是我们的这个平方的这个数量级更大,因此这个还可以继续化简:
n
2
=
=
=
>
最后的化简结果
n^2===>最后的化简结果
n2===>最后的化简结果
下面的这个两个数量级进行比较:这个显然是n^2占据主导地位;
下面的这个是求运算的执行次数,我们的这个执行次数就不可以像上面的时间复杂度那么粗糙了,因为我们的时间复杂度进行计算的时候是可以粗糙一些的,只要注重这个量级就可以了,但是这个执行的次数的话,是多少就是多少,我们不可以只关注量级,但是这个我们带入几个实例,就会发现这个就是我们的等差数列求和,只不过这个公差是2,但是这个还是使用的我们的这个等差数列的求和的公式;
最后计算的这个执行的次数就是n(n+1)如果是时间复杂度就是n^2,但是我们的这个问的就是执行的次数,所以是多少就写多少;
下面的是递归:但是并不难理解,因为这个每一次都是除以2,因此这个最后直到等于1的时候就结束了,所以这个实际上正向的分析就是2的n次方等于我们的n求解这个执行的次数,就是以2为底的n的对数,我们的这个选项里面的这个log n实际上是把这个底数省略了;
下面的这个是双层循环:外面是执行了log n次,里面是执行的n次,两个的乘积就是我们的程序段的这个时间复杂度;
上面的题目都是数据结构的基础的题目,下面的这个题目还算是有些可以考察的点:但是这个实际上还是我们的这个等差数列求和,最后的结果是n,所以相当于是平方等于n所以这个时间复杂度就是根号n;
下面的这个题目更加有趣了,也是我认为很有难度的题目,我第一次就做错了:首先这个i层是每一次乘上2,这个次数就是log n对吧,里面的执行的次数取决于我们的i,实际上这个就是等比数列;
i=1的时候,这个里面相当于就是2的0次方,然后i=2,里面就是2的一次方,以此类推,这个就是我们的等比数列的求和公式的使用,最后等比求和应该是2^n量级把,但是这个n取决于我们的这的外层,外层是我们的log n,这个指对转换之后就是O(n)数量级(非常有考察点的一个题目);
后i=2,里面就是2的一次方,以此类推,这个就是我们的等比数列的求和公式的使用,最后等比求和应该是2^n量级把,但是这个n取决于我们的这的外层,外层是我们的log n,这个指对转换之后就是O(n)数量级(非常有考察点的一个题目);