搜索数组报告“未找到”即使已找到

时间:2017-03-20 20:55:44

标签: arrays search language-agnostic

这是我在各种语言的新程序员的许多问题中看到的逻辑错误的一般性问题和答案。

问题是在数组中搜索与某些输入条件匹配的元素。伪代码中的算法看起来像这样:

always_false

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

1 个答案:

答案 0 :(得分:6)

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

简单的修改是使用一个跟踪你是否找到某个东西的变量,然后在循环结束时检查这个变量。

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在else:循环中有一个for块。这仅在循环运行完成时执行代码,而不是由于使用break而结束。这允许您避免使用found变量(尽管它可能对以后的处理有用):

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

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

  • 某些语言有一个anysome函数,它接受一个回调函数,并返回一个布尔值,指示它是否对数组的任何元素都成功。
  • 如果语言具有数组过滤功能,则可以使用检查条件的函数过滤输入数组,然后检查结果是否为空数组。
  • 如果您尝试完全匹配元素,则大多数语言都会提供findindex函数来搜索匹配元素。

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