【问题标题】:Searching array reports "not found" even though it's found搜索数组报告“未找到”,即使找到了
【发布时间】:2017-08-12 07:59:38
【问题描述】:

这是一个通用问题和一个逻辑错误的答案,我在许多新程序员的各种语言问题中都看到了这个问题。

问题是在数组中搜索与某些输入条件匹配的元素。该算法的伪代码如下所示:

for each element of Array:
    if element matches criteria:
        do something with element
        maybe break out of loop (if only interested in first match)
    else:
        print "Not found"

即使成功找到匹配元素,此代码也会报告“未找到”。

【问题讨论】:

  • 删除else 语句,使其适用于for循环而不是if语句
  • @F1Rumors 只有 Python 有这个功能,我在我的回答中展示了它。

标签: arrays search language-agnostic


【解决方案1】:

问题在于,当您通过数组线性搜索某些内容时,您无法知道直到到达数组末尾才找到它。问题中的代码会为每个不匹配的元素报告“未找到”,即使可能存在其他匹配元素。

简单的修改是使用一个变量来跟踪你是否发现了什么,然后在循环结束时检查这个变量。

found = false
for each element of Array:
    if element matches criteria:
        do something with element
        found = true
        maybe break out of loop (if only interested in first match)

if not found:
    print "Not found"

Python 在其for 循环中有一个else: 块。这仅在循环运行完成时才执行代码,而不是由于使用break 而结束。这使您可以避免使用 found 变量(尽管它可能对以后的处理仍然有用):

for element in someIterable:
    if matchesCriteria(element):
        print("Found")
        break
else:
    print("Not found")

某些语言具有内置机制,可以用来代替编写自己的循环。

  • 有些语言有一个 any 或 some 函数,它接受一个回调函数,并返回一个布尔值,指示它是否对数组的任何元素都成功。
  • 如果语言有数组过滤功能,可以用检查条件的函数过滤输入数组,然后检查结果是否为空数组。
  • 如果您要精确匹配元素,大多数语言都提供find 或index 函数来搜索匹配元素。

如果您要经常搜索,最好将数组转换为可以更有效地搜索的数据结构。大多数语言提供set 和/或hash table 数据结构(后者根据语言有许多名称,例如关联数组、映射、字典),这些通常可以在 O(1) 时间内搜索,同时扫描一个数组是 O(n)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多