Small-K 2019-09-29 10:35 采纳率: 0%
浏览 241

拉格朗日插值查找的疑问

最近学到拉格朗日插值查找,发现了一个bug

网上找到的写法大多是这样

void lagrangeSearch(int num, int *a, int length)
{
    int count = 0; //记录查找几次,对比二分查找
    int flag = 0; //标志是否找到
    int max = length - 1;
    int min = 0;
    //int mid =  (max+min)/2 //容易溢出
    int mid;


    while (min <= max)
    {
        count++;
        //没有判断num-a[min]是否小于0,如果小于0不就出错了吗,mid有可能变成负数,造成不正确的访问
        mid = min + (max - min) * 1.0 *(num - a[min]) / (a[max] - a[min]);
        if (num > a[mid])
        {
            min = mid + 1;
        }
        else if (num < a[mid])
        {
            max = mid - 1;
        }
        else
        {
            flag = 1;
            break;
        }
    }

    if (flag == 1)
    {
        printf("拉格朗日找到了,下标为:%d,查找了%d次\n", mid, count);
    }
    else {
        printf("不存在\n");
    }
}

如代码所示(mid = min + (max - min) * 1.0 *(num - a[min]) / (a[max] - a[min]);)

如果不加以判断的话,num-a[min]是有可能小于0的,造成整个式子小于0,mid就变成了负数,如此访问的话不就访问到了错误的地址吗?

请问我考虑的对吗?

自己改动后的:

//拉格朗日查找
void lagrangeSearch(int num, int *a, int length)
{
    int count = 0; //记录查找几次,对比二分查找
    int flag = 0; //标志是否找到
    int max = length - 1;
    int min = 0;
    //int mid =  (max+min)/2 //容易溢出
    int mid;

    //当num<a[min]时,拉格朗日差值为负,无法正常判断
    if (num >= a[min] && num <= a[max])
    {
        while (min <= max)
        {
            count++;
            mid = min + (max - min) * 1.0 *(num - a[min]) / (a[max] - a[min]);
            if (num > a[mid])
            {
                min = mid + 1;
            }
            else if (num < a[mid])
            {
                max = mid - 1;
            }
            else
            {
                flag = 1;
                break;
            }
        }
    }


    if (flag == 1)
    {
        printf("拉格朗日找到了,下标为:%d,查找了%d次\n", mid,count);
    }
    else {
        printf("不存在\n");
    }
}
  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝