算法导论习题—排序最坏情况线性时间选择算法小顺序统计量
Posted 之墨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法导论习题—排序最坏情况线性时间选择算法小顺序统计量相关的知识,希望对你有一定的参考价值。
算法基础习题—排序、最坏情况线性时间选择算法、小顺序统计量
- 1. 1. 1. 下面的排序算法中哪些是稳定的:插入排序、归并排序、堆排序、快速排序和计数排序?给出一个能使任何排序算法都稳定的方法。你所给出的方法带来的额外时间和空间开销是多少?
- 2. 2. 2.给定一个整数数组,其中不同的整数所包含的数字的位数可能不同。但该数组中,所有整数中包含的总数字位数为 n n n。设计算法使其可以在 O ( n ) O(n) O(n)时间内对该数组进行排序。
- 3 3 3.(小顺序统计量) S E L E C T SELECT SELECT算法(找第 i i i小的元素)最坏情况下的比较次数 T ( n ) = Θ ( n ) T(n) =\\Theta(n) T(n)=Θ(n),但是其中的常数项是非常大的。请对其进行优化,使其满足:
- 1. 在最坏情况下的比较次数为 Θ ( n ) \\Theta(n) Θ(n)。
- 2. 当 i i i是小于 n / 2 n/2 n/2的常数时,最坏情况下只需要进行 n + O ( log n ) n+ O(\\log n) n+O(logn)次比较。
1. 1. 1. 下面的排序算法中哪些是稳定的:插入排序、归并排序、堆排序、快速排序和计数排序?给出一个能使任何排序算法都稳定的方法。你所给出的方法带来的额外时间和空间开销是多少?
插入排序、归并排序、计数排序是稳定的。
将数组元素的下标也考虑在比较过程中,即对于原始数组 a r r arr arr的每一个元素 a r r [ i ] arr[i] arr[i]都建立一个结构体 a [ i ] : v a l u e : a r r [ i ] , i n d e x : i a[i]:\\value:arr[i],index:i\\ a[i]:value:arr[i],index:i存入结构体数组 a a a中,在比较大小时,当 a [ i ] . v a l u e < a [ j ] . v a l u e a[i].value<a[j].value a[i].value<a[j].value或者 a [ i ] . v a l u e = = a [ j ] . v a l u e & & a [ i ] . i n d e x < a [ j ] . i n d e x a[i].value==a[j].value\\&\\&a[i].index<a[j].index a[i].value==a[j].value&&a[i].index<a[j].index时我们认为 a [ i ] < a [ j ] a[i]<a[j] a[i]<a[j],否则认为 a [ i ] > a [ j ] a[i]>a[j] a[i]>a[j],按照这个规则进行排序可以保证任意的排序算法均是稳定的,需要的空间是原来的两倍,额外时间在于 a [ i ] . v a l u e = = a [ j ] . v a l u e a[i].value==a[j].value a[i].value==a[j].value时对 i n d e x index index进行比较的时间,但在线性时间内,不影响总体时间复杂度。
2. 2. 2.给定一个整数数组,其中不同的整数所包含的数字的位数可能不同。但该数组中,所有整数中包含的总数字位数为 n n n。设计算法使其可以在 O ( n ) O(n) O(n)时间内对该数组进行排序。
设第 i i i个整数的位数为 c i c_i ci,有 m m m个整数,则 ∑ i = 1 m c i = n \\sum\\limits^m_i=1c_i=n i=1∑mci=n,若最高位数为 c m a x ≤ n c_max\\le n cmax≤n,则此时使用基数排序的时间复杂度为 Θ ( c m a x ⋅ m ) \\Theta(c_max·m) Θ(cmax⋅m),不满足 O ( n ) O(n) O(n)时间复杂度的要求。
考虑将数组先按数字位数进行分组,再对每一组采用基数排序,对第 i i i个有 c i c_i ci位的整数,确定它的位数需要的时间为 c i c_i ci,则确定所有分组需要的时间为 ∑ i = 1 m c i = n = Θ ( n ) \\sum\\limits^m_i=1c_i=n=\\Theta(n) i=1∑mci=n=Θ(n)。假设总共分为 x x x组,对于第 k k k组,该组的每个元素位数为 c k c_k ck,有 m k m_k mk个元素,总位数及总元素个数分别为 ∑ k = 1 x c k = n , ∑ k = 1 x m k = m \\sum\\limits^x_k=1c_k=n,\\sum\\limits^x_k=1m_k=m k=1∑xck=n,k=1∑xmk=m,对第 k k k组采用基数排序的时间复杂度为 Θ ( c k ⋅ m k ) \\Theta(c_k·m_k) Θ(ck⋅mk),总时间复杂度为 ∑ k = 1 x Θ ( c k ⋅ m k ) = Θ ( c 1 m 1 ) + Θ ( c 2 m 2 ) + … + Θ ( c x m x ) = Θ ( n ) \\sum\\limits^x_k=1\\Theta(c_k·m_k)=\\Theta(c_1m_1)+\\Theta(c_2m_2)+…+\\Theta(c_xm_x)=\\Theta(n) k=1∑xΘ(ck⋅mk)=Θ(c1m1)+Θ(c2m2)+…+Θ(cxmx)=Θ(n),满足在 O ( n ) O(n) O(n)时间内进行排序的要求。
3 3 3.(小顺序统计量) S E L E C T SELECT SELECT算法(找第 i i i小的元素)最坏情况下的比较次数 T ( n ) = Θ ( n ) T(n) =\\Theta(n) T(n)=Θ(n),但是其中的常数项是非常大的。请对其进行优化,使其满足:
1. 在最坏情况下的比较次数为 Θ ( n ) \\Theta(n) Θ(n)。
2. 当 i i i是小于 n / 2 n/2 n/2的常数时,最坏情况下只需要进行 n + O ( log n ) n+ O(\\log n) n+O(logn)次比较。
将输入的数组划分为
⌊
n
/
2
⌋
\\lfloor n/2 \\rfloor
⌊n/2⌋组,比较次数为
⌊
n
2
以上是关于算法导论习题—排序最坏情况线性时间选择算法小顺序统计量的主要内容,如果未能解决你的问题,请参考以下文章