
原题是指 O (n)=(NlogN)/1000,显然反了

并不是一定要有输入

因为 sum=1+2+3+...+k=k (k+1) 2>=n 是停止条件。对其省略较小项,有 k^2≈n,可得答案

对于第二个,展开后是 2^k 次方之间相加,也就是说最后是一个等比数列,而不是 P1 的等差

假设终值为 k,显然 k 也是循环次数,有 k^2=n,然后解出 k 即可

不理解,感觉只有 A 是对的

其实数组才是,随机存取不是指存储地址是否连续,而是是否能够随机读写数据(数组通过索引实现),这区分了随机和顺序(链表)顺序结构。
也就是取决于读取而不是存储
有如下表述:
顺序表(数组)是随机存取(顺序存储)的数据结构
链表是顺序存取(随机存储)的数据结构

注意 AD 是直接给了地址,O (1)

100+3n=100 -3, 可得一行有 39 个(0-38), 最后 100+5*39+5

三对角矩阵的每行至多三个非零元素,只有首尾是两个

是起始地址,所以虽然地址是 1140-1145,但是要写 1140

看豆包怎么说的:

到此为止能确定的都要运算
优先级更大才能进栈,若小于等于当前栈顶,需要出栈到遇到大于为止(或者遇到左括号,立即入栈)
如果栈顶为左括号,直接入栈,若待入栈者是右括号,直到出栈一个左括号为止,并且不入栈

此时头指针就是指向头节点,直接移动到下一个即可。入队时尾指针指向新节点后再移动
反之出队反而是头指针直接移动到下一个
如果是使用数组实现,会造成假溢出问题,因为指针一直都在向后移动,最后移动到末尾,但是前面却是空的

首先头一定要,其次如果只有一个,都要

也就是尾指针的下一个就是头指针

这道题当初想了很久还是做错了,上图实际上是正确的,可以直接随便一个序列验证,当然似乎和冒泡没有关系

归并一共是 logN 次分解,每次分解比较 N 次,时间复杂度为 NlogN
所有基于比较的都不会小于这个值

选择排序可以只跑 3 次,但是堆排序(使用优先队列,O (logN))不行

排序码是用于排序的数字,本来就是要变的,相同时不改变原来顺序才是稳定性

选择排序是等差求和,但是一轮交换一次
快排是选择基准(一般是第一个数),然后剩下的比其小的放左,大的放右,分别重复上述过程(递归))。当本身有序时,每次都是选到最小大的为基准,导致退化到 N*N

有序在发现介于两者间就可以停了

选择排序的核心思想是在未排序的区间中找到最小(或最大)元素,将其放到已排序区间的末尾 ,无论如何都是 O(n^2)
插入排序则是将每个元素插入到已排序区间的适当位置,如果本身有序,每次只比较一次 O(n)
选择和插入都是相对于已排序的序列而言的,但由于插入排序插第 0 个完全没有必要,所以从 1 开始
插入:13 插入到 15 前,其他不变。
选择:选到最小的 12,然后和 13 交换,其他不变。
冒泡:(冒泡排的有序序列在末尾,所以实际上第一轮应该是使得最大的到最后)
显然第一个是 13,因为本身是第二个而且要交换。不过这里是个变种(反过来遍历,使得第一轮让最小的到最前,但都是相邻元素交换)
计数:一把梭是这样的

二分查找,对于有序序列用于找到某个特定值,对于无序序列则是找到某一个极值

基数排序是按位计数排序(个位 -> 十位),然后再排序,O(kn), 也就是 O(n)
12,11,10,9
10,11,12,9 按个位排序
9,10,12,11 按十位排序
桶排序是分为几组,分别排序,最后合并,计数排序就是特殊到一桶一个

C 项左分区的 5 明显有问题

只有有序数组用于查找特定元素,上面有说过无序数组只能找到一个极值

只有 1,2 是一样的,3 反了,插入排序反而要移动,选择每次只有交换

前:根左右
中:左根右
后:左右根前中后指的是遍历根的位置
所以无论如何都不可能使得某两种是一样的,除非单个(无根)
# AVL 树
左旋:
RR 情况,即节点右失衡,并且右子树的右子树偏高
右旋:
LL 情况
左右旋转:
RL 情况,即节点右偏高,但是是右子树的左子树偏高
右左旋转:
LR 情况,反之。
"LR 型失衡的本质是 ' 左子树先左后右偏 ',因此需要先通过左旋转将其转化为 LL 型失衡(左 - 左偏),再通过右旋转彻底修复平衡。两次旋转的组合操作,能够有效调整子树深度,使失衡节点的平衡因子回归正常范围。"
注意左右旋说的是操作顺序,不是偏高的顺序。而且如果存在多级的失衡:
如
10
\
5 20
\
30
\
40
是 20 右偏高左旋,而不是 10!!!!!

完全二叉树,第 i 层最多有 2 (k-1) 个,前 k 层共有 2k-1 个
前四层:15
第五层:16,其中 8 个是叶,还有 8 个有第六层的子节点
第六层:8*2=16
共 15+16+16=47


带权最短路径(WPL)就是对本来数据的层数 * 值的求和


纯定义

如果没有冲突的话)

要被同一个函数映射到同一地址

当装填因子接近 1 时,总会冲突的。而且容量为质数虽然在一定程度上可以减少冲突,但也会导致某些位置永远也不会被探测到。 称为 “聚集” 和 “二次聚集”


就等差求和 1-N


遇到空槽本身也算是一次比较这里需要取 0-6(哈希值可能的值)并且计算其每一个情况求平均 (7)
如果有删除,已删除的位置不能算空

链地址法就是将其挂到对应位置的节点的后面(每一个位置都是一个链表)

合并的操作本身没有 find,所以被合并的除去根以外并没有变化
PS: 按秩合并指的是将规模小的并入规模大的

先序遍历总是先访问根再访问子节点,对于图来讲就是先访问顶点,然后访问这个顶点连接到的所有点。
层次遍历是按照层次访问,对于图就是按照走过的路径条数访问。

邻接矩阵没有边(记录的是某两个之间是否相连),只能遍历这个矩阵才行
但是邻接表不一样 (类下题图,将连接到的点都挂在自己身上),有几条边就有几条,所以只是 O (E)

由此可以知道,广度优先就是按照链表顺序访问,0->1>2->3,先访问完由 0 连接到的点,然后继续(如果还有未访问,从一步可达的顶点再出发)。深度优先就是从 0 访问到 1 后,转到 1 访问 2(不要陷入循环!也就是要排除已访问的 0,访问 2, 然后 2 也要跳过 0 和 1 访问 3,最后 3 访问后,后续都被排除,结束,也就是 0->1->2->3)

前两者是用于求最小生成树的,也就是过所有顶点的路径和最短的情况。
但是对于某两个顶点间,不一定是最短的。

拓扑排序是对于有向无环图来说,也就是按照 u->v 的顺序排列,一个通路)
逆拓扑反之,与实际值没有任何关系

实际上图的 DFS 输出的就是拓扑排序,如果输出时将根的输出移动到递归之后(也就是把前序遍历改成后序遍历),获得的就是逆拓扑排序的结果