二分法查詢是比較常見的查詢演算法。
對於乙個有序序列,注意:是有序序列,找出其中某乙個元素,通常的做法是序列中拿出乙個乙個的元素,每個元素和所需元素作比較,如果是想要的結果,就把元素的序號輸出來。例如有序列:0, 3, 5, 7, 9, 11, 12, 13。我想要找7這個元素,我就取第乙個元素0,和「11」比較,發現不是,然後取第二個「3」和「11」比較...直到取到第六個元素「11」,發現是想要的,就輸出6。這樣查詢的時間複雜度很明顯是n。
這樣做顯然不夠完美,寫程式是講究執行效率的。以上面的序列「0, 3, 5, 7, 9, 11, 12, 13」為例,二分法的做法是:首先確定查詢的「區間」,區間左端是「0」,區間右端是「13」,然後取這個區間中點作為和需要比較的物件比較,如果中點元素大於要查物件,就把中點作為下次查詢的區間的左端(以從小到大的序列為例,如果序列是從大到小反之為右端),原來的右端還是右端;如果中點元素小於要查的物件,就把中點作為下次查詢的區間的右端...然後繼續這樣比較,直到查到所查元素為止。這樣查詢的時間複雜度是log2n。可能很多人對於這個結果的所得表示很茫然,讓我們來一起算一下。假設序列的長度是n,那麼第一次查詢後變為:n/2,第二次查詢後:n/4...假設第x次 後找到所選數字:n/(2^x);這個時候序列的長度應該是大於或者等於1的;即2^x >= n ,由於算的是x的次數,可令 2^x = n ;得出:x = log2n 即時間複雜度為:log2n。如果這樣不是很好理解,我們換乙個思維想想:
時間複雜度不就是迴圈的次數嘛,求時間複雜度實際上就是求迴圈了多少次唄~我們倒著推:假設現在已經取到所需的元素,那麼現在的序列長度肯定是大於等於一,就令他為一,時間複雜度嘛,為的就是算最長需要的時間嘛,它現在乘以2就是上一次的長度,再乘以2就是上上此的長度,假設成了x次後變為了n,那麼為: 2^x = n。迴圈次數x為log2n,即時間複雜度為:log2n。
以下分別是用golang、php和scala寫的二分法查詢:
golang:
//輸出-1代表沒有此數字
Python opencv 二 畫素運算 二
使用工具python3.x 使用庫numpy opencv,1.cv.bitwise and s1,s2 s1,s2為cv.imread函式返回的物件,表示將s1和s2的畫素進行邏輯與運算,函式會返回乙個物件。可以通過cv.imshow顯示出進行直觀感受。2.cv.bitwise or s1,s2 ...
大二第二學期周學習進度總結(二)
本週檢測的是從文件中讀取隨機數並得到最大連續子陣列,難度並不是很大,主要是需要使用biginteger來進行運算解決問題,我經常有這樣的感覺,就是很多情況下已經有了很成熟的技術,但是我們這些初學者僅僅是因為不知道,所以導致我們不知道這些方法如何解決,這個問題在課堂上困住了不少人,也許不少人是因為懶得...
二叉堆實現二
堆可以視為一棵完全二叉樹,樹的每一層都是被填滿的,最後一層可能除外,所以堆可以用陣列來表示。對於陣列中任意位置 i上的元素,其左兒子在位置 i 2 1 其右兒子在位置 i 2 2 上,其父節點在位置 i 1 2 1處。二叉堆有兩種 最大堆和最小堆。最大堆中,除根結點外 其無父結點 每個結點的關鍵字都...