二分分類演算法
本文實例講述了PHP二分查找演算法的實現方法。分享給大家供大家參考,具體如下:
二分查找法需要數組是一個有序的數組
假設我們的數組是一個遞增的數組,首先我們需要找到數組的中間位置.
1.
要知道中間位置就需要知道起始位置和結束位置,然後取出中間位置的值來和我們的值做對比。
2.
如果中間值大於我們的給定值,說明我們的值在中間位置之前,此時需要再次二分,因為在中間之前,所以我們需要變的值是結束位置的值,此時結束位置的值應該是我們此時的中間位置。
3.
反之,如果中間值小於我們給定的值,那麼說明給定值在中間位置之後,此時需要再次將後一部分的值進行二分,因為在中間值之後,所以我們需要改變的值是開始位置的值,此時開始位置的值應該是我們此時的中間位置,直到我們找到指定值。
4.
或者中間值等於最初的起始位置,或結束位置(此時說明給定值未找到),下面我們來用代碼實現~
//循環實現
function
getValue($num,$arr)
{
//查找數組的中間位置
$length=count($arr);
$start=0;
$end=$length;
$middle=floor(($start+$end)/2);
//循環判斷
while($start>$end-1)
{
if($arr[middle]==$num)
{
return
middle+1;
}
elseif($arr[middle]<$num)
{
//如果當前要查找的值比當前數組的中間值還要打,那麼意味著該值在數組的後半段
//所以起始位置變成當前的middle的值,end位置不變。
$start=$middle;
$middle=floor(($start+$end)/2);
}
else{
//反之
$end=$middle;
$middle=floor(($start+$end)/2);
}
}
return
false;
}
//遞歸實現
/*
*
從數組中獲取元素值
*
@param1
int
$num,要查找的目標值
*
@param2
array
$arr,要查找的數組
*
@param3
int
$start,查找的起始位置
*
@param4
int
$end,查找的結束位置
*
@return
mixed,找到了返回位置,沒找到返回false
*/
function
getValue4($num,$arr,$start
=
0,$end
=
100){
//採用二分法查找
$middle
=
floor(($end
+
$start)
/
2);
//判斷
if($arr[$middle]
==
$num){
//已經找到了,遞歸的出口
return
$middle
+
1;
}elseif($arr[$middle]
<
$num){
//要查找的元素在數組的後半段
$start
=
$middle
+
1;
//邊界值
if($start
>=
$end){
//沒有找到,但是已經超出邊界值,遞歸出口
return
false;
}
//調用自己去查找:遞歸點
return
getValue4($num,$arr,$start,$end);
//getValue4($num,$arr,51,100)
}else{
//要查找的元素在數組的前半段
$end
=
$middle
-
1;
//判斷邊界值
if($end
<
0)return
false;
//調用自己:遞歸點
return
getValue4($num,$arr,$start,$end);
//getValue4($num,$arr,0,49)
}
//都沒有找到
return
false;
}
更多關於PHP相關內容感興趣的讀者可查看本站專題:《PHP數據結構與演算法教程》、《PHP基本語法入門教程》、《php面向對象程序設計入門教程》、《php字元串(string)用法總結》及《php查找技巧與方法總結》
希望本文所述對大家PHP程序設計有所幫助。
B. 什麼是二分法
二分法(Bisection method) 即一分為二的方法. 設[a,b]為R的閉區間. 逐次二分法就是造出如下的區間序列([an,bn]):a0=a,b0=b,且對任一自然數n,[an+1,bn+1]或者等於[an,cn],或者等於[cn,bn],其中cn表示[an,bn]的中點。
(2)二分分類演算法擴展閱讀
典型演算法
演算法:當數據量很大適宜採用該方法。採用二分法查找時,數據需是排好序的。
基本思想:假設數據是按升序排序的,對於給定值key,從序列的中間位置k開始比較,
如果當前位置arr[k]值等於key,則查找成功;
若key小於當前位置值arr[k],則在數列的前半段中查找,arr[low,mid-1];
若key大於當前位置值arr[k],則在數列的後半段中繼續查找arr[mid+1,high],
直到找到為止,時間復雜度:O(log(n))。
C. 如果數據分布不均勻,怎麼優化二分查找演算法
樓主是不是想求出一個最小半徑的圓,圓內包含所有的點?這個問題很有趣。
尋找這個圓的時候注意一下幾點:
1.這個圓必然穿過圖中某些靠外圍的點,這樣才是最小半徑的圓。
2.幾何中我們知道,三個點可以確定一個圓, 我們就是需要找出這三個點來.
演算法如下:1.先求這些點對應的凸包,已經有現成的演算法。
2.生成凸包後,在看凸包上哪三點確定的圓可以包含凸包。
當然如果樓主討論的不是以上所述,而是模式分類的話,建議看看數據分類方法。可以搜索關鍵字:Gaussian mixtrual model, expectation-maximization algorithm 和 k-mean algorithm 學習下相關的知識。
D. 二分排序法的演算法思想是什麼如何進行二分排序...不是插入和查找
個人認為和快排的思路是一樣的。。。數組當中隨機找一個支點(pivot),小於它的所有數放一邊a1,大於它的所有數放另一邊b1。然後,在a1,b1中使用相同的思路進行排序,也就是遞歸啦。
直到遞歸到基礎情況(即一個數組中只有2-5個數的時候)。使用最基本的排序演算法進行排序。
E. 小白弱弱的問一下,有哪個大神知道二分類演算法的定義是啥,也就是什麼演算法就是二分類演算法了
可用於二分類的演算法有很多,比如決策樹演算法,隨機森林演算法,樸素貝葉斯,還有邏輯回歸,都典型二分類的演算法。
F. 二分查找法的具體演算法
折半查找法也稱為二分查找法,它充分利用了元素間的次序關系,採用分治策略,可在最壞的情況下用O(log n)完成搜索任務。它的基本思想是,將n個元素分成個數大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,演算法終止。如果x<a[n/2],則我們只要在數組a的左半部繼續搜索x(這里假設數組元素呈升序排列)。如果x>a[n/2],則我們只要在數組a的右半部繼續搜索x。二分搜索法的應用極其廣泛,而且它的思想易於理解,但是要寫一個正確的二分搜索演算法也不是一件簡單的事。第一個二分搜索演算法早在1946年就出現了,但是第一個完全正確的二分搜索演算法直到1962年才出現。Bentley在他的著作《Writing Correct Programs》中寫道,90%的計算機專家不能在2小時內寫出完全正確的二分搜索演算法。問題的關鍵在於准確地制定各次查找范圍的邊界以及終止條件的確定,正確地歸納奇偶數的各種情況,其實整理後可以發現它的具體演算法是很直觀的,我們可用C++描述如下:
template<class Type>
int BinarySearch(Type a[],const Type& x,int n)
{
int left=0;
int right=n-1;
while(left<=right){
int middle=(left+right)/2;
if (x==a[middle]) return middle;
if (x>a[middle]) left=middle+1;
else right=middle-1;
}
return -1;
}
模板函數BinarySearch在a[0]<=a[1]<=...<=a[n-1]共n個升序排列的元素中搜索x,找到x時返回其在數組中的位置,否則返回-1。容易看出,每執行一次while循環,待搜索數組的大小減少一半,因此整個演算法在最壞情況下的時間復雜度為O(log n)。在數據量很大的時候,它的線性查找在時間復雜度上的優劣一目瞭然。
G. 二分排序演算法是什麼 我聽說過快速排序 折半查找 怎麼沒聽說過二分排序 筆試題
其一:
二分排序是用二分法(就是折半查找)查找插入位置,來進行排序的。其實就是插入排序的一種修改。寫一段代碼解釋一下:
void MidInsertSort(int array[],int n)
{
int left,right,num;
int middle,j,i;
for(i = 1;i < n;i++)
{
left = 0;// 准備
right = i-1;
num = array[i];
while( right >= left)// 二分法查找插入位置
{
middle = ( left + right ) / 2; // 指向已排序好的中間位置
if( num < array[middle] )// 即將插入的元素應當在在左區間
right = middle-1;
else // 即將插入的元素應當在右區間
left = middle+1;
}
//每次查找完畢後,left總比right大一,a[left]總是存放第一個比num大的數,因此應從此處開始,每
//個元素右移一位,並將num存入a[left]中,這樣就保證了a[0...i]是排好序的
for( j = i-1;j >= left;j-- )// 後移排序碼大於R[i]的記錄
array[j+1] = array[j];
array[left] = num;// 插入
}
}
以上引自http://blog.sina.com.cn/s/blog_4b9eab320100kl08.html
其二:
如果是「二分歸並排序」,就應該是折半排序。。。
主流的說法就這兩種。
H. 二分類和多分類的區別
二分類、多分類與多標簽的基本概念
二分類:表示分類任務中有兩個類別,比如我們想識別一幅圖片是不是貓。也就是說,訓練一個分類器,輸入一幅圖片,用特徵向量x表示,輸出是不是貓,用y=0或1表示。二類分類是假設每個樣本都被設置了一個且僅有一個標簽 0 或者 1。
多類分類(Multiclass classification): 表示分類任務中有多個類別, 比如對一堆水果圖片分類, 它們可能是橘子、蘋果、梨等. 多類分類是假設每個樣本都被設置了一個且僅有一個標簽: 一個水果可以是蘋果或者梨, 但是同時不可能是兩者。
多標簽分類(Multilabel classification): 給每個樣本一系列的目標標簽. 可以想像成一個數據點的各屬性不是相互排斥的(一個水果既是蘋果又是梨就是相互排斥的), 比如一個文檔相關的話題. 一個文本可能被同時認為是宗教、政治、金融或者教育相關話題。
多分類問題與二分類問題關系
首先,兩類問題是分類問題中最簡單的一種。其次,很多多類問題可以被分解為多個兩類問題進行求解(請看下文分解)。所以,歷史上有很多演算法都是針對兩類問題提出的。下面我們來分析如何處理多分類問題:
直接分成多類
其中,是向量 y 中取值為 1 對應的第 j個分量的值。這兩個長的不一樣的損失函數實際上是對應的不同的輸出層。本質上是一樣的。
我的建議是,採用Kears中的命名方法,對於二分類的交叉熵損失函數稱之為「二分類交叉熵損失函數(binary_crossentropy)」,對於多分類的交叉熵損失函數稱之為「多類別交叉熵損失函數(categorical_crossentropy)」。
在 Kears 中也有提示(注意: 當使用categorical_crossentropy損失時,你的目標值應該是分類格式 (即,如果你有10個類,每個樣本的目標值應該是一個10維的向量,這個向量除了表示類別的那個索引為1,其他均為0)。 為了將 整數目標值 轉換為 分類目標值,你可以使用Keras實用函數to_categorical:)
多標簽分類 + 二分類交叉熵損失函數
多標簽問題與二分類問題關系在上文已經討論過了,方法是計算一個樣本各個標簽的損失(輸出層採用sigmoid函數),然後取平均值。把一個多標簽問題,轉化為了在每個標簽上的二分類問題。
I. 數據結構最簡單的 二分查找 演算法看不懂
struct record{int key; int others;};
int bisearch(struct record r[ ], int k)
{
int low=0,mid,high=n-1;
while(low<=high)
{
__mid=(low+high)/2__;
if(r[mid].key==k)
return(mid+1); //數組下標是0到n-1,所以返回值要+1
else
if(r[mid].key>k) //如果r[mid]的key值大於k
high=mid-1; //查找范圍減半,變成low到mid-1
else low=mid+1; //如果r[mid]的key值小於等於k 查找范圍減半,變成mid+1到high
}
return(0);
}
J. binary classification是什麼意思
binary classification
二分類
例句:
1.
Then starting from the concept 'scale of contexts' with a combination of two cognitive principles, we reanalyze the motivation for the binary classification mentioned above, thus indicating it is necessary to make further explorations on it by taking this opportunity.
在此基礎上,建議把某些認知因素(省力原則和盡力原則)介入其中,以語境量為出發點,重新解析一般會話含義和特殊會話含義的劃分理據,並提出應以此為契機,對該問題進行進一步的探索。