演算法導論 趣題集錦(持續更新中)

2021-04-30 17:14:09 字數 3881 閱讀 6858

by:

潘雲登

對於商業目的下對本文的任何行為需經作者同意。

寫在前面1.

本文內容取自《演算法導論》(第

2版)》,題目多為書中習題。書與習題答案可以從這裡(

part1

,part2 2.

所提供的**都是參考書或習題答案編寫,在

gcc-4.3.3

下簡單測試過。 3.

makefile

檔案可以參考《

makefile

備忘錄》中的範例編寫。 4.

希望本文對您有所幫助。關於題目的理解和實現,都極有可能包含錯誤,歡迎隨時提出意見和建議。 5.

enjoy youself j

題目索引題目

1. 兩數之和

題目2.

霍納規則

題目3.

逆序對題目

4. 區間計數 題目

5. 選擇問題

題目6.

兩陣列中位數 

題目1.

兩數之和(

習題

2.3-7)

237_sum.c

題目索引

請給出乙個執行時間為

θ(n lg n)

的演算法,使之能在給定乙個由

n個整數構成的集合

s和另乙個整數

x時,判斷出

s中是否存在有兩個其和等於

x的元素。

解題步驟: 1.

對陣列s

進行歸併排序。 2.

構造陣列

s』=,並排序。由於

s已經有序,構造與排序可一併完成。 3.

刪除s中重複的元素使僅保留乙個,對

s』進行同樣的操作。 4.

合併s和s』

,並保證合併後有序,這裡可以使用歸併排序的思想。 5.

如果在合併後的陣列中存在連續兩個相同的元素,並且這種元素的個數大於

1,那麼有解。

設想在合併後的陣列中存在連續兩個w,則

w分別屬於s和

s』,那麼

s中存在y使得

w=x-y

,即x=y+w

。因此,

s中元素w和

y的和為x。

步驟1的執行時間為

θ(n lg n)

,其餘步驟執行時間為

θ(n)

,因此總的時間代價為

θ(n lg n)。

題目2.

霍納規則(

習題

2-3)

23_horner.c

題目索引

對多項式

p(x)=∑k=0..n akxk

進行求值。

樸素多項式求值演算法,使用雙重迴圈計算多項式的每一項,

p(x)=∑k=0..n akxk =a0+a1x+…+anxn

,執行時間為

θ(n2)。

霍納規則,將多項式展開為如下形式後,

p(x)=∑k=0..n akxk =a0+x(a1+x(a2+…+x(an-1+xan)))

,用累計計算將時間代價降低為

θ(n)。

y <-

an i

<-

nwhile(i>=0)

do y

<-

ai + x * y

i <-

i-1

題目3.

逆序對(

習題

2-4)

24_inversion.c

題目索引 設

a[1..n]

是乙個包含

n個不同數的陣列。如果在

i的情況下,有

a[i]>a[j]

,則(i,j)

就稱為a

中的乙個逆序對。給出乙個演算法,它能用

θ(n lg n)

的最壞情況執行時間,確定

n個元素的任何排列中逆序對的數目。

如果沒有執行時間要求,則可以用插入排序的思想進行計數。實際上,逆序對正是基於比較的排序演算法在迴圈過程中試圖消除的。也就是說,在排序演算法的迴圈過程中,能夠對逆序對進行統計。因此,這裡可以修改時間代價為

θ(n lg n)

的歸併排序,進行求解。

題目4.區間計數(

習題

8.2-4)

824_counting.c 

題目索引

請給出乙個演算法,使之對於給定的介於0到k之間的n個整數進行預處理,並能在o(1)時間內,回答出輸入的整數中有多少個落在區間[a..b]內。你給出的演算法的預處理時間應是

θ(n+k)。

本題條件符合計數排序

對每乙個輸入元素

x,確定出小於

x的元素個數

c[x]

。然後,c[b]-c[a-1]即為落在區間[a..b]內的整數個數。

題目5.選擇問題(

9章)

c92_select.c 

題目索引

在平均情況下,以線性時間,在乙個由n個元素組成的集合中,選擇第i小的元素。

一種用來解決選擇問題的分治演算法,以快速排序

演算法為模型。區別在於,這裡只要遞迴地處理劃分的一邊。

int randomized_select(int *array, int p, int r, int i)

題目6.兩陣列中位數(

習題

9.3-8)

938_median.c 

題目索引

設x[1..n]和y[1..n]為兩個陣列,每個都包含n個已排好序的數。給出乙個求陣列x和y中所有2n個元素的中位數的、o(lg n)時間的演算法。

o(lg n)

的時間要求不允許線性比較陣列的每乙個元素,只能進行二分查詢。假設兩陣列的中位數字於陣列x中,且下標為k,那麼陣列x中有k個元素小於等於x[k]和n-k個元素大於等於x[k],同時,陣列y中有n-k個元素小於等於x[k]和k個元素大於等於x[k],並且y[n−k]

≤x[k]≤y[n

−k+1]

。因此,本題解法可以使用二分法,從陣列x的x[(1+n)/2]元素開始,遞迴檢查上述條件是否成立,以確定中位數下標k。如果在陣列x中無法確定k,可以對y進行相同的查詢。

備戰秋招 演算法程式設計題集錦(持續更新)

1.清雨的自助餐 題目描述 清雨又在吃自助餐了。排在清雨面前的有n種食物,排成一排,清雨可以選擇其中的若干種食物,但是不能連續選擇相鄰的食物。因為清雨很挑食,當所有食物都不合胃口的時候,他可以一種都不選,即乙個都不選也算為一種方法。請問他有多少種選擇食物的方法?輸入 乙個整數n 1 n 90 輸出 ...

《演算法導論》摘記 經典演算法題集錦

分治策略 diogenes教授有n個被認為是完全相同的vlsi晶元,原則上它們是可以互相測試的。教授的測試裝置一次可測二片,當該裝置中放有兩片晶元時,每一片就對另一片作測試並報告其好壞。乙個好的晶元總是能夠報告另一片的好壞,但乙個壞的晶元的結果是不可靠的。這樣,每次測試的四種可能結果如下 a晶元報告...

演算法題(Math) 持續更新

1 找第n位數字。無限數列1,2,3,4,5,6,7,8,9,10,11,12.第一位是1,第五位是5,第十位是1 10的第首位 第十一位是0 10的末位 第十二位是1 11的首位 三步 1 找到第n位所在數字的長度。2,找到第n位所在的具體數字。3,返回第n位。public int findnth...