跳到主要内容

名古屋大学 情報学研究科 情報システム学専攻 2021年8月実施 専門 問3

Author

祭音Myyura

Description

自然数の有限列のうち、含まれている要素が重複しないものを考える。 そのような列 SS に含まれる要素のうちで kk 番目に小さい数(小さい方から数えて kk 番目の数)を求める再帰的アルゴリズム select(図1)について以下の問いに答えよ。 なお、X|X| は有限列 XX の要素数を表し、 \lceil \ \rceil は天井関数を表す。 天井関数は引数として受け取る実数 rr に対して、rr 以上の最小の整数を返す。 さらに、有限列 XX の中位数は XX の中で X2\lceil \frac{|X|}{2} \rceil 番目に小さい要素とする。

(1) SS を以下の列、kk1010 とする。

11,12,16,33,2,18,39,15,21,7,37,29,40,6,25,27,14,4,35,28,22,20,17,3,111, 12, 16, 33, 2, 18, 39, 15, 21, 7, 37, 29, 40, 6, 25, 27, 14, 4, 35, 28, 22, 20, 17, 3, 1
  • (a) このような SkS、k に対して図 1 の手順の 1. から 5. を順に実行したときに求められる手順の中の列 MM、自然数 xx、列 AA を示せ。なお、列 AA の要素の並び順についてはアルゴリズムでは言及していないので、解答では並び順を問わない。

  • (b) このような SkS、k に対して select(SS,kk) を実行したときの出力を答えよ。

(2) n=Sn = |S| とし、nn1010 の倍数としたときに列 AA に含まれ得る要素の数の最小値と最大値それぞれをnを用いた式で表せ。

(3) n=Sn = |S| とする。図 1 の手順において、2. における列 G1,,GNG_1, \ldots, G_N を得る操作、5. における列 A,BA, B を得る操作の最大時間計算量をそれぞれ O(n)O(n) とする。このとき、select(SS,kk)(ただし、0<kn0 < k \leq n )を実行したときの最大時間計算量をオーダー記法で示せ。解答では S|S| でない nn を用いること。

(4) 以下の整列アルゴリズムを考える。

(a) バブルソート        (b) マージソート        (c) ヒープソート
(d) クイックソート (e) 挿入ソート (f) バケットソート

(a)〜(f) のうち、入力として与えられる列の要素数を nn としたときに以下の条件をすべて満たすものを1つ選択せよ。

  • 最大時間計算量が O(n2)O(n^2) である。
  • 図 1 のアルゴリズムを利用することで最大時間計算量を O(nlogn)O(n \log n) に改善できる。

再帰的アルゴリズム select

入力 重複する要素を持たない自然数の有限列 SS、正整数 kk(ただし、kSk \leq |S|

出力SS に含まれる要素のうちで kk 番目に小さいもの

手順

  1. NNS5\lceil \frac{|S|}{5} \rceil とする。
  2. SS を先頭から順に要素5つずつの列 G1,,GNG_1, \ldots, G_N に分ける。つまり、列 G1G_1 から列 GNG_N を順に連結すると列 SS に一致する。さらに、列 G1,,GN1G_1, \ldots, G_{N-1} それぞれに含まれる要素数は5であり、S|S|55 の倍数ではないときに列 GNG_N の要素数は5に満たない。
  3. MM を列 G1,,GNG_1, \ldots, G_N それぞれの中央値からなる列とする。なお、列 MM の要素の並び順は先頭から順に列 G1,,GNG_1, \ldots, G_N の中央値が並んでいるとする。
  4. xx を列 MM の中央値、すなわち、select(MM, M2\lceil \frac{|M|}{2} \rceil) の返り値とする。
  5. A,BA, B を以下を満たす列とする。
{aa は列 A に含まれる要素 }={ySy<x}\{a \mid a \text{ は列 } A \text{ に含まれる要素 }\} = \{y \in S \mid y < x\}
{bb は列 B に含まれる要素 }={ySx<y}\{b \mid b \text{ は列 } B \text{ に含まれる要素 }\} = \{y \in S \mid x < y\}
  1. A=k1|A| = k - 1 のときは xx を返して終了し、そうでないときは次に進む。
  2. Ak|A| \geq k のときは select(AA, kk) の返り値を返して終了し、そうでないときは次に進む。
  3. select(BB, kA1k - |A| - 1) の返り値を返して終了する。

図 1: kk 番目に小さい要素を求めるアルゴリズム

出典:名古屋大学 入学試験問題

题目描述

考虑一个元素互不重复的有限自然数序列 SS。递归算法 select(S,k) 用于求 SS 中第 kk 小的元素,其中 X|X| 表示序列长度,r\lceil r\rceil 表示不小于 rr 的最小整数;序列的中位数定义为第 X/2\lceil |X|/2\rceil 小的元素。

算法步骤如下。

  1. N=S/5N=\lceil |S|/5\rceil,从前到后把 SS 分成至多含 5 个元素的组 G1,,GNG_1,\ldots,G_N
  2. 组成序列 MM,其元素依次为各组的中位数;递归求 MM 的中位数 xx
  3. SS 中小于 xx 的元素组成 AA,大于 xx 的元素组成 BB
  4. A=k1|A|=k-1,返回 xx;若 Ak|A|\ge k,递归返回 select(A,k);否则返回 select(B,k-|A|-1)

完整算法定义见上文。回答下列问题。

  1. S=(11,12,16,33,2,18,39,15,21,7,37,29,40,6,25,27,14,4,35,28,22,20,17,3,1),k=10,S=(11,12,16,33,2,18,39,15,21,7,37,29,40,6,25,27,14,4,35,28,22,20,17,3,1),\quad k=10,

    依次执行步骤 1—5,写出序列 MM、自然数 xx 和序列 AAAA 中元素顺序不限);并求 select(S,10) 的输出。

  2. n=Sn=|S|nn 为 10 的倍数,用 nn 表示序列 AA 可能包含的元素数的最小值与最大值。

  3. 假定分组以及构造 A,BA,B 的操作均为 O(n)O(n),求 select(S,k) 的最坏时间复杂度。

  4. 在冒泡排序、归并排序、堆排序、快速排序、插入排序、桶排序中,选择一种最坏复杂度原为 O(n2)O(n^2),但利用该 select 算法选取枢轴后可改进为最坏 O(nlogn)O(n\log n) 的排序算法。

Kai

図1の再帰的アルゴリズム select は「中央値の中央値 (median of medians)」と呼ばれ、クイックセレクトに基づく選択アルゴリズムである。以下では、S=1|S|=1 なら唯一の要素を直ちに返す基底ケースを用いる。

(1)

(a)

S = [11, 12, 16, 33, 2, 18, 39, 15, 21, 7, 37, 29, 40, 6, 25, 27, 14, 4, 35, 28, 22, 20, 17, 3, 1]

M = [12, 18, 29, 27, 17]

x = 18

A = [11, 12, 16, 2, 15, 7, 6, 14, 4, 17, 3, 1]

(b)

15

(2)

m=n/5m=n/5 とおくと mm は偶数で、xxMM の第 m/2m/2 番目の要素である。

xx より小さい中央値をもつ m/21m/2-1 組から各3個、xx の組から2個が xx 未満なので、

Amin=3(m21)+2=3n101.|A|_{\min}=3\left(\frac m2-1\right)+2=\frac{3n}{10}-1.

一方、xx より大きい中央値をもつ m/2m/2 組から各3個、xx の組から2個が xx より大きい。したがって、

Amax=n1(3m2+2)=7n103.|A|_{\max}=n-1-\left(\frac{3m}{2}+2\right)=\frac{7n}{10}-3.

(3)

nn が任意の正整数の場合も、各組の要素数は高々5なので、組の中央値の計算と分割には O(n)O(n) 時間を要する。 N=n/5N=\lceil n/5\rceil 個の中央値から xx を選ぶ。最後の不完全な組と xx を含む組を除けば、xx の各側に少なくとも N/22\lfloor N/2\rfloor-2 個の完全な組がある。その各組は少なくとも3個の要素を対応する側に保証する。したがって、選択を再帰する側の要素数は高々 7n/10+O(1)7n/10+O(1) である。

最悪時間計算量 T(n)T(n) は、ある定数 a,b>0a,b>0 により

T(n)T(n/5)+T(7n/10+b)+anT(n)\le T(\lceil n/5\rceil)+T(\lfloor7n/10+b\rfloor)+an

を満たす。十分大きい nn では2つの再帰引数の和は 0.95n0.95n 以下となる。小さい nn の基底ケースを覆い、かつ c20ac\ge20a となるように cc を選べば、強い帰納法により

T(n)0.95cn+ancnT(n)\le0.95cn+an\le cn

を得る。よって T(n)=O(n)T(n)=O(n) であり、分割の Ω(n)\Omega(n) と合わせて T(n)=Θ(n)\boxed{T(n)=\Theta(n)} である。

(4)

(d) クイックソート

線形時間の選択で真の中央値をピボットとすれば、各部分列は高々 (n1)/2\lceil(n-1)/2\rceil 要素となるため、クイックソートの最悪計算量は O(nlogn)O(n\log n) となる。