黃金分割查詢

2021-07-28 22:02:32 字數 1588 閱讀 2099

在二分查詢中,我們是取mid等於left和right的中間值,即用等分的方法進行查詢。

那為什麼一定要等分吶?能不能進行「**分割」?也就是mid=left+0.618(right-left),當然mid要取整數。如果這樣查詢,時間複雜性是多少?也許你還可以程式設計做個試驗,比較一下二分法和「**分割」法的執行效率。

(本例用c語言中的clock來測定程式時間)

#include #include #include 

#define maxlength 10000000

struct node ;

typedef struct node *list;

clock_t start1, stop1, start2, stop2;

double duration;

int binarysearch (list tbl, int k);

int goldensearch (list tbl, int k);

int main()

start1 = clock();

for (j=1;j<=maxlength-1;j++)

stop1 = clock ();

duration = ((double)(stop1-start1))/clk_tck/(maxlength-1);

printf ("duration of binarysearch is %6.2es.\n", duration);

start2 = clock();

for (j=1;j<=maxlength-1;j++)

stop2 = clock ();

duration = ((double)(stop2-start2))/clk_tck/(maxlength-1);

printf ("duration of goldensearch is %6.2es.\n", duration);

return 0;

}int goldensearch (list tbl, int k)

return nofound;

}int binarysearch (list tbl, int k)

return nofound;

}

算了下在乙個長度為maxlength、a[i]等於i的陣列裡面,找乙個i平均要花的時間。讓maxlength等於10000000。

輸出:

duration of binarysearch is 1.35e-007s.

duration of goldensearch is 2.74e-007s.

二分法每次能有100%的概率能只剩50%的資料,每次剩下的期望為50%,即每次除以2。所以時間複雜度是。

而**分割的話每次都有0.618的概率剩0.618,0.382的概率剩0.382,每次剩下的期望為0.528,即每次除以1.894。所以時間複雜度是。

雖然兩者都是o(logn)類,但是係數不同,**分割法所需時間約為二分法的1.085倍(此處沒考慮取整……)。

假設分割點距左側的距離除以全長等於p,那麼每次剩下的期望為個全長。要讓這個期望最小,我們知道p要等於1-p。所以p=0.5。所以二分法分在正中。

數學 黃金分割比

今天讀了一本科普讀物,數學美,其中將到了 分割比,普遍的人都認為用 分割比建築的東西是最美得,為什麼全世界的人,都很喜歡這種比例關係呢,我認為在人類的dna中存在乙個基因,這個基因就是,用來存放 分割比的資訊,那這個基因又是怎麼來的呢,我認為在人類還沒進化 的時候,更高階的智慧型生物來到過地球,他們...

結對程式 黃金分割

這周我們的軟體工程作業是結對程式設計。經過前幾次的個人編寫程式,慢慢地找到了一些感覺。對於這次結對程式設計還是挺新鮮的,更是期待後期的團隊程式設計。結對程式設計究竟是什麼樣子的呢,書上的解釋是這樣的 在結對程式設計模式下,一對程式設計員肩並肩,平等地,互補地進行開發工作。他們併排坐在一台電腦前,面對...

結對程式設計 黃金分割

專案 分割 專案詳情 分工 這次專案採用的是c s方式工作。我寫的是客戶端,主要處理使用者介面互動,資料的傳送。李全清同學寫服務端,用於接收並處理使用者的資料並且 給所有使用者。規範 規範,大括號採用k r風格。每個if,else,for,do,while後都要有乙個大括號,即使有一條語句。變數名和...