有關二分法的一點思考

2021-06-03 12:38:49 字數 962 閱讀 5090

前幾天看到乙個學習演算法的資源。。其中講到二分法,提到了用二分搜尋技術查詢已經排好序的n個元素中的某個元素。。本身是很簡單的。但是後面有乙個思考題,提到如何使用二分法求a的n次方。但沒有給出答案。我想了一會兒,不會。但是又想了一會兒,突然有思路了。二分法其實是一種分治的思想,分而治之。。找到他們最小部分的共同點。普通求a的n次方的方法,最簡單的莫過於:

int power(int a,int n)

return result;

}

其實有更好的辦法,如果n恰好是2的冪,比如說是8,我們就可以採用平方模式,

第一次迴圈算出x·x=x

2,第二次迴圈算出x2·x

2=x4,第三次迴圈算出4·x

4=x8。這樣只需要三次迴圈。那麼,關鍵是如果n不是2的整數次冪應該怎麼處理。

其實我們可以換一種思維方式,既然是二分法,我們把十進位制轉換為二進位制,應該更好一些。。比如說n=100,我們要把100表示為二進位制為:1100100,那麼我們又是怎樣把100轉換成這樣的0,1序列的呢。不就是因為100可以拆分成64+32+4嗎。他們都是2的冪,而且他們對應的是2進製某一位的1,其餘低位全是0。這不就好處理了嗎,我們只要把n拆分成若干個某個位是1的序列,將其加起來就行了。那麼我們怎樣定位到相應的1呢,我們可以靠右移來逐步將最近的1變到最低位,在這個過程中,如果最低為是0,我們就不加,最低為是1,我們就加,因為他正是我們所需要的。其實就是偶數和奇數,可以靠和「1」按位與來判斷。

這樣我們就可以輕易的寫出**:

int power(int a,int n)

a*= a;

n = n >> 1;//右移

}return result;

}

對應的遞迴版本:

int power(int a,int n)

}

關於二分法的一點小總結

使用二分法步驟如下 給資料排序 使用二分查詢 function binsearch r,k return 0 當low high時表示查詢區間為空,查詢失敗 binseareh 舉例,乙個json格式的分級陣列的二分應用 if data data opts.jsonname va else if d...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...