本文目录一览:
C语言 二分法查找次数公式怎么推导?
对具有n个元素的有序数组进行二分法查找,要分析的比较次数,可以使用画二叉判定树的方法来分析。该二叉判定树的高度为[log2(n)]+1层,此即为二分查找的最多比较次数,比如:n=1000,则最多比较[log2(1000)]+1=9+1=10次。
如果要计算平均的比较次数,则需要对二叉判定树中的每个节点进行分析,处于第一层的比较1次,第二层的比较2次,第三层比较3次,依次类推……把各个节点的比较次数累加,再处于节点数(元素个数)即为平均比较次数,这里假设查找是在等概率的情况下进行的。
举个例子:有9个元素的有序数组,对每个元素按1,2,3...8,9进行编号,则其二叉判定树如下:
图中可以看出,如果要找的元素处在第5个位置,则只要1次比较即可找到,若找第9个元素,则需要4次比较,算法分别比较了第5,7,8,9等4个元素。所以,平均的比较次数大概如下:
这样分析,能看懂吗?希望能帮到你!
在C语言中什么是二分法
举个例子吧,有一组有序数字,要查找某一数字,判断中间数字是否符合条件,不符合再从中间分成两半,选择符合的一半,再判断再分,直到找到或者不能再分为止。
注意一定是有序的,不能用于无序的数据查找。这样每次都砍去一半,时间复杂度仅为lg(n),查找非常快。
C语言二分查找法
#include stdio.h
int binfind(int val[] , int num , int value)
{
int start = 0;
int end = num - 1;
int mid = (start + end)/2;
while(val[mid] != value start end)
{
if (val[mid] value)
{
end = mid - 1;
}
else if (val[mid] value)
{
start = mid + 1;
}
mid = ( start + end )/2;
}
if (val[mid] == value)
return mid;
else
return -1;
}
int main()
{
int nums[] = {1 , 3 , 4 ,7 ,8 , 12 ,45 ,67 ,97 ,123 ,456 ,675 ,1111 , 4534 , 4563};
int result = binfind(nums , sizeof(nums) / sizeof(nums[0]) , 45);
if (result 0)
{
printf("查无此数");
}
}
C语言中的2分法是什么意思 怎么弄 例如这题
) 用二分法求下面方程在(-10,10)之间的根。 2x3-4x2+3x-6=0【提示】(1) 取两个不同点x1、x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根(曲线与x轴的交点)。如果f(x1)与f(x2)同符号,则应改变x1、x2,直到f(x1)、f(x2)异号为止。注意x1、x2的值不应相差太大,以保证(x1,x2)区间只有一根。
(2) x1和x2两点之间的中点x=(x1+x2)/2,见图4-1,再从x求出函数值f(x)。
(3) 若f(x)与f(x1)同符号,则根必在(x,x2)区间内,此时将x作为新的x1;如果f(x)与f(x2)同符号,则表示根在(x1,x)区间内,将x作为新的x2。
(4) 重复步骤(2)和(3),直到|f(x)|ε为止,ε为一个很小的数。此时认为f(x)≈0,x即为根。
根据上述思路画出N-S流程图,如图4-2所示。源程序命名为p5_8.c。
#include math.h
#include stdio.h
double fun(double x) { return 2 * x * x * x - 4 * x * x + 3 * x - 6; }
double root(double a, double b, double e)
{
double x1, x2, y1, x, y;
x1 = a; x2 = b;
do {
x = (x1 + x2)/2;
y = fun(x);
y1 = fun(x1);
if( ( y 0 y1 0) || (y 0 y1 0) )
x1 = x;
else
x2 = x;
/*end if*/
}while(fabs(y) e);
return x;
}
int main(void)
{
double x = root(-10.0f, 10.0f, 1e-8);
printf("%f\n", x);
return 0;
}