5.1-2 用random(0,1)來實現random(a,b),並估計執行時間.
這個cu上面有討論。
我想了乙個超級白痴的 random(a,b) = random(0,1)*(b-a)+a
不曉得cu上搞得這麼複雜。怪也~
5.1-3 假設你希望以各1/2的概率輸出0和1。你可以自由使用乙個輸出0和1的過程biased-random。它以概率p輸出1,以概率1-p輸出0,其中010.1.6 說明如何用兩個棧來實現乙個佇列,並分析有關佇列操作的執行時間。
10.1.7 說明如何用兩個佇列來實現乙個棧,並分析有關棧操作的執行時間。
用兩個棧來實現佇列比較簡單,因為棧是先進後出,佇列是先進先出,有兩個棧,做兩次先進後出,那麼就成先進先出了(就有點負負得正的意思)。假設兩個棧為a,b,入隊的時候直接將資料壓入第乙個棧a,出隊的時候直接從棧b出棧,若b為空,則將棧a資料全部彈出,乙個乙個的壓入棧b。時間複雜度和標準佇列一樣,為o(1)。
用兩個佇列來實現棧就有點複雜了。佇列是先進先出,兩個先進先出合起來也還是先進先出啊,該怎麼反過來呢?想到的辦法是兩個佇列輪流儲存資料。任意時刻乙個隊列為空,乙個佇列不為空。每次提取資料的時候,將非空佇列的前n-1個資料轉出到另外乙個佇列中。然後將第n個資料出隊。每次入隊都將資料新增在非空佇列上。但這樣子入隊時間複雜度為o(1),出隊時間複雜度為o(n),很大啊。有更好的辦法麼?
9.1-2 在最壞情況下,同時找到n個數字中的最大值和最小值需要 3/2n-2 次比較。
找到 最大值 需要比較 n-1 次
找到 最小值 需要比較 n-1 次
同時找到 最大值 和 最小值 需要 2n-2 次
該怎麼減少到 3/2n-2次呢?
找到 最大值 的比較次數已經是最少的,已經不能再減少;找最小值也一樣的,那該怎麼減少呢?
問題的關鍵在於兩者的結合,也就是要同時。對任意乙個元素,它不可能同時為最大值和最小值。
在同時找到最大值和最小值時,每個元素都參與了與最大值和最小值的比較,比較了兩次。將數組成對處理。兩兩互相比較,將大的與最大值比較,小的與最小值比較。每兩個元素需要的比較次數是,兩兩比較一次,大者與最大值比較一次,小者與最小值比較一次,共三次。
《演算法導論》習題答案和教師手冊
演算法導論2 幾個習題 2016 1 2
二 氣泡排序 氣泡排序效率幾乎是所有排序裡最低的,但卻很流行,就是因為它的程式設計複雜度也是最低的。大多數時候,效率還不及插入排序,其實氣泡排序 插入排序 選擇排序基本上效果是差不多的 這個效果不是功能。功能上講肯定差不多啊都是排序 只是過程略有區別。既然寫到這裡,就自己總結一下三者吧。1.插入排序...
演算法導論 習題 5 4 1
題 乙個房間裡必須要有多少人,才能讓某人和你生日相同的概率至少為1 2?必須要有多少人,才能讓至少兩個人生日為7月4日的概率大於1 2?解 1.假設一年有n 365 天,房間裡面有x人 不算自己 為求某人與自己生日相同,可求其反面,即房間裡面沒人跟自己生日相同,他們每個人生日可以在n天中選擇除去我生...
演算法導論 習題 6 5 8
題 請給出乙個時間為o nlgk 用來將k個已排序鍊錶合併為乙個排序鍊錶的演算法。此處n為所有輸入鍊錶中元素的總數。k個已排序鍊錶,假設每乙個鍊錶的第乙個元素為root i i 1,2,3.k 那麼可以為這k個元素root i 構造乙個最小堆heap min,其時間複雜度為o lgk 此時堆頂元素假...