赞
踩
1
<
l
o
g
n
<
n
<
n
<
n
l
o
g
n
<
n
2
<
2
n
<
n
!
1<logn<\sqrt{n}<n<nlogn<n^2<2^n<n!
1<logn<n
<n<nlogn<n2<2n<n!
基本语句是 while 中的比较操作,因此,进行了 logn + 1 次,而不是 logn 次
复杂度
Θ
(
n
2
)
\Theta(n^2)
Θ(n2)
稳定性: 不稳定,举例 5 8 5 2,这样 2 和第一个 5 交换位置之后,就不稳定了
in-place 是原地排序算法
每次都从待排序列中选择最小的那个,交换到待排的位置。
冒泡排序
冒泡排序复杂度
Θ
(
n
2
)
\Theta(n^2)
Θ(n2)
插入排序的基础思路是,将待插入的元素不断地和前一个进行比较,如果符合条件,就和前面的一个交换位置,从而实现最终把待排元素插入正确的位置,但是这样就无法避免多次冗余的 swap 行为,所以通过减治来解决这个问题。
假设总字符串长度为
n
n
n ,模板字符串长度为
m
m
m
总的比较次数最差的时候,外层循环
i
i
i 需要挪动
n
−
m
+
1
n-m+1
n−m+1 次,
i
i
i 每次 挪动的时候,内部的
j
j
j 都要最多挪动
m
m
m 次,因此总的复杂度为
m
(
n
−
m
+
1
)
m(n-m+1)
m(n−m+1)
复杂度:
复杂度:
m 是 哈希表的 size, n 是存储的数据数量
插入复杂度:最坏为 O ( n ) O(n) O(n),如果建立的是平衡的二叉树,那么插入的复杂度为 O ( l o g n ) O(logn) O(logn)
被删除的节点包含四种情况
直接删除
直接删除,左孩子节点替代当前的位置
直接删除,右孩子节点代替当前的位置
其实很好理解,看下面这个图
数组,链表,队列,堆,栈,优先级队列,二叉树,图,集合
除了基本的数据类型数组之外,其他的数据类型由于需要通过基本数据类型来实现,因此都是抽象的数据类型。
队列,堆,栈,优先级队列,二叉树,图
树是连通的无环图
图的边的数量
E
=
V
−
1
E = V-1
E=V−1
插入排序的基础思路是,将待插入的元素不断地和前一个进行比较,如果符合条件,就和前面的一个交换位置,从而实现最终把待排元素插入正确的位置,但是这样就无法避免多次冗余的 swap 行为,所以通过减治来解决这个问题。
拓扑排序有解的条件是,必须不能有环存在!!!即,绝对不能够出现 back edge
Example:
复杂度:
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)
最坏情况下:
所以对于一个正整数,最多比较的次数上限就是
l
o
g
2
(
n
+
1
)
log_2(n+1)
log2(n+1) 次
复杂度:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
建堆复杂度:linear-time( O ( n ) O(n) O(n))
为什么不交换完之后直接把 9 弹出,而要最后再弹出 9
优先级队列的相关操作:
2-3 树存在两种节点:
复杂度: 线性复杂度,因为不需要进行 comparison。
适用情况: 序列中重复的值很多,不重复的值很少且范围较小。
这种情况下我们可以:
一共有 n n n 个物品,重量分别为 w 1 , w 2 , . . . . . , w n w_1,w_2,.....,w_n w1,w2,.....,wn,价值分别为 v 1 , v 2 , . . . v n v_1,v_2,...v_n v1,v2,...vn 背包的容量为 W W W
这道题的关键是要找出递归关系,如何建立在 v v v 和 w w w 之上的递归关系
让我们先回顾一下选硬币的思路:
S
(
i
)
=
M
A
X
{
S
(
i
−
1
)
,
S
(
i
−
2
)
+
v
i
}
S(i)=MAX\{S(i−1),S(i−2)+v_i\}
S(i)=MAX{S(i−1),S(i−2)+vi}
这个思路就是分为了针对第
i
i
i 个硬币的时候,选还是不选。
同样地,当我们把一对物品排成一行,挨个问你选不选的时候,就变成了类似的问题。好,让我们切换一下情景。一共
i
i
i 个物品摆在这里
我们用 S ( i ) S(i) S(i) 表示对于第 i i i 个物品做出最好选择之后得到的价值
从第 i i i 个开始考虑写递归式,假设我取了第 i i i 个物品, S ( i ) = S ( i − 1 ) + v i S(i)=S(i-1)+v_i S(i)=S(i−1)+vi,如果不取第 i i i 个,那么 S ( i ) = S ( i − 1 ) S(i)=S(i-1) S(i)=S(i−1) 到这个地方为止似乎没毛病,但是出现了一个问题,那就是:相对于选硬币问题,背包问题是个两维度的问题,就是说它的选择 既涉及到价值,又涉及到重量。因此,重量也应该是我们考虑的一个因素,那么怎么把重量因素加入现有的递归式呢?
因此我们在构造递归式的时候这么考虑,当我正面对第 i i i 个元素犹豫不决的时候,我的目标只有一个那就是使整个包就会在当前重量限制下达到最大的价值,用 S ( i , W ) S(i,W) S(i,W) 来表示这个目标、因此,我们现在把原递归式扩展成:
假设我面对第 i i i 个物品,我取了它,接下来我要面对的物品是 1 , 2 , . . . , i − 1 1,2,...,i-1 1,2,...,i−1,而整个包的重量限制会变成 W − w i W-w_i W−wi,因此当我取了第 i i i 个物品, S ( i , W ) = S ( i − 1 , W − w i ) + v i S(i,W)=S(i-1,W-w_i)+v_i S(i,W)=S(i−1,W−wi)+vi,而如果我不取它,那么下一步的重量限制还是 W W W,因此为 S ( i , W ) = S ( i − 1 , W ) S(i,W)=S(i-1,W) S(i,W)=S(i−1,W)
结合取第 i i i 个物品和不取,递归式应该类似于选硬币问题:
S ( i , W ) = m a x { S ( i − 1 , W − w i ) + v i , S ( i − 1 , W ) } S(i,W)=max\{S(i-1,W-w_i)+v_i,S(i-1,W)\} S(i,W)=max{S(i−1,W−wi)+vi,S(i−1,W)}
当然还有一点需要考虑,也是背包问题较为复杂的原因,那就是,当我们面对第 i 个物品的时候,如果他本身的重量就比当前的背包重量限制还要大,即 W < w i W<w_i W<wi 那我们没有办法,直接不能选择这个物品,所以这种情况下 S ( i , W ) = S ( i − 1 , W ) S(i,W)=S(i-1,W) S(i,W)=S(i−1,W)。
综上所述,整个背包问题可以被用如下的递归式进行表示:
复杂度:
O
(
n
3
)
O(n^3)
O(n3)
生成树
有向图和无向图都适用
迪杰斯特拉算法不能用于存在负数边的情况。否则会出现下面情况
用于找到从一个 固定的起始点 开始到 其他所有点 分别的最短距离,即 单源的最短距离问题。
区别于 Floyd 算法:Floyd 可以找到 每个点到其他另外的点分别的最短距离
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。