二分分类算法
本文实例讲述了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.
在此基础上,建议把某些认知因素(省力原则和尽力原则)介入其中,以语境量为出发点,重新解析一般会话含义和特殊会话含义的划分理据,并提出应以此为契机,对该问题进行进一步的探索。