(本部落格基於演算法筆記)
演算法筆記中有一句話「二分查詢的過程與序列的下標從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 從這裡開始,並且所...