【问题标题】:Pls help me understand a while condition in search function请帮助我了解搜索功能中的 while 条件
【发布时间】:2022-12-13 10:44:33
【问题描述】:

所以我正在学习关于排序数组和 while 循环的 c,我正在学习的书中的代码:

//function to perform binary search of an array
size_t binarySearch(const int b[], int searchKey, size_t low, size_t high)
{
    //loop until low index is greater than high index
    while (low <= high) {
        
        //determine middle element of subarray being searched
        size_t middle = (low + high) / 2;

        //display subarray used in this iteration
        printRow(b, low, middle, high);

        // if searchKey matched middle element, return middle
        if (searchKey == b[middle]) {
             return middle;
        }

        // if searchKey is less than middle element, set new high
        else if (searchKey < b[middle]) {
           high = middle - 1; //search low end of array
        }

        else {
           low = middle + 1; //search high end of the array
        }
     }//end while

     return -1; //searchKey not found
}
         

问题是我不知道初始 while 条件是如何工作的”而(低 <= 高)“,我的意思是低永远不会大于高,谁能告诉我在什么情况下低会大于高,从而终止循环?

我试图写下并形象化算法的工作原理,但无法理解

【问题讨论】:

  • 整数除法错误可能导致middle + 1(低)大于middle - 1(高)(即使分配这些值的语句由排他性 if 块分隔)从而满足退出条件
  • low能够变得大于highlow = middle + 1;。如果 low 是(例如)5 而 high 是 5,那么 low 就变成 6。

标签: c loops search while-loop


【解决方案1】:

好吧,不要把声明当作日常谈话中的东西。当然,通常不会讨论 5 比 8 更高的可能性。

但在代码、循环和条件中,情况有所不同,因为代码是动态的。如果您遵循代码,在众多条件中,您会看到有一种情况 low = middle + 1;(这是最后一个条件)。在“相反”的频谱上,您会看到它上方的条件high = middle - 1;。当然还有一个控制中间的:middle = (low + high) / 2;

在这种情况下,低价有机会(假设您达到其条件)增加而高价有机会(同样,假设您达到其条件)减少。

回到我们在 5 和 8 开头的随机示例,这意味着第一个数字最终可能会从 7 上升到 8 可能下降到 4。当然,在我们的代码中,您需要按照实际流程查看价值观以及他们如何以及何时达到这些条件。

但最重要的是,低点和高点从来都不是静止的。这是一种罕见的情况,因为您会发现大多数循环只修改第一个变量(在我们的例子中是 **low **)。但这就是一种循环模式:您从一个值或一个条件开始,然后在代码中前进,直到您打破该条件。

小警告:因为控制流是人为的,如果不注意它们可能会以无限循环结束(意味着永远不会触发停止条件)。这意味着程序将进入一个循环并基本上“静止不动”,但仍然会耗尽 CPU 能力(并且,根据它在循环中所做的事情,甚至会耗尽内存,直到机器内存耗尽)。

作为预防措施,您会在某些循环中看到如下内容:

int i = 0;
while (some condition)
{
    if (i++ > some number)
        break;

    ... some control flow code
}

这样做是一个故障安全停止。每个循环递增一个变量,直到程序员认为足够安全的数字然后退出循环。 break 是退出循环的方式。当然,这只是一种故障保护,正如我所说,通常您需要确保循环内的代码得到正确处理,并且不会发生无限循环。

【讨论】:

    【解决方案2】:

    low &gt; high 时,这意味着该列表不包含searchKey

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多