二分查詢的進一步學習

2021-10-01 08:30:43 字數 1872 閱讀 6120

(本部落格基於演算法筆記)

演算法筆記中有一句話「二分查詢的過程與序列的下標從0還是從1開始無關」,我一開始覺得這句話明顯有誤,畢竟乙個陣列,如果是從1開始豈不是少了乙個數字?我覺得作者在這裡應該指的是,有些人使用的陣列,習慣從1開始儲存,有的人習慣從0開始,我們的重點不應該放在下標上,而是放在陣列的起始位置上(這就是我的理解)

void binarysearch(int a,int left,int right,int x)

else if(a[mid]>x)

right = mid -1;

else

left = mid+1;

}printf("查詢失敗\n");

}

如果陣列過大,mid值就有可能越界,所以設定

mid = left + (right-left)/2

如果遞增序列a中存在重複元素,x為待查詢元素,目的是找到序列中第乙個大於等於x的位置與第乙個大於x的位置,這兩個位置構成乙個集合[l,r},此集合中全部都是x數值。

先看第乙個問題,第乙個大於等於x的位置,問題發生了改變,即使是序列中沒有x元素,那麼也應該返回位置n。

所以迴圈的條件變成了 while(left牛頓迭代法:

各種函式

木棒切割問題:

給出幾根木棒的長度,然後給出切割的數目,求切割的最大長度是多少

一開始我沒有動腦筋,直接設定

int left = *min_element(a,a+n);

int right = 0;

int mid = (right+left)/2

這當然是錯誤的,尋找切割的最大長度應該是乙個「在乙個遞減序列中,找到第乙個滿足要求的數值位置」。當然也可以直接就查詢:

void test5()

else

left=left-1;

}printf("找不到滿足題意的解");

}

木棒分割怎麼著都會有解的,這個**其實有點問題。

結合前文,**應該修改為:

void test5()

else

right = mid;

}printf("%d",mid);

}

while的終止條件尤其值得注意。

遞迴思想的求冪演算法。

這裡插乙個小知識:

typedef:

如果放在所有函式之外,它的作用域就是從它定義開始直到檔案尾;

如果放在某個函式內,定義域就是從定義開始直到該函式結尾;

#define:

不管是在某個函式內,還是在所有函式之外,作用域都是從定義開始直到整個檔案結尾。

快速冪當然就是遞迴的思想,以a^10為例:

a^10 = a ^ 5 * a ^ 5

a ^ 5 = a * a ^ 4

a ^ 4 = a ^ 2 * a ^ 2

a ^ 2 = a ^ 1 * a ^ 1

a ^ 1 = a * a ^ 0(雖然是句廢話,但是在程式設計的時候就不是廢話了)

long long test6(long long a,long long b,long long m)

}

而快速冪的迭**法,可以這樣理解:

a ^13 = a ^ 8 * a ^4 * a ^ 1

要求必須使用二進位制來表示;

//快速冪的而迭**法

long long test6(long long a,long long b,long long m)

a = a*a %m;

b>>1;

}return ans;

}

Looper Handler進一步學習

package com.test.looper import android.os.bundle import android.os.handler import android.os.handlerthread import android.os.looper import android.os....

Sevlet進一步學習

request物件與response物件是tomcat建立的,不需要我們建立。requst物件的一些常用方法 獲取請求引數通用方式 不論get還是post請求方式都可以使用下列方法來獲取請求引數 string getparameter string name 根據引數名稱獲取引數值 username...

html 進一步學習

標籤 基本格式 lang en charset utf 8 titletitle head body html 不是標籤,而是一種宣告,讓瀏覽器知道 html 是用什麼版本編寫的,這裡表示用的 html5 版本 這裡類似於程式語言中主函式或者主方法,也就是乙個入口,整個 html 從這裡開始,並且所...