我注意到代码评审中的一个常见问题,即采用以下形式:
// "arr" is an array
for (i = 0; i < arr.length; ++i) {
if (i == 3) {
// do something with arr[i]
}
if (i == 8) {
// do something else with arr[i]
}
}我称之为“数组=循环”心态。不知怎么的,他们脑子里有这样的想法:如果你想使用数组,就必须使用循环。我想知道这种心态的根源是什么..。这与教育有关吗?他们缺少什么概念?这怎么可能不教呢?
发布于 2015-11-17 23:03:12
你的问题标题和问题中的代码不匹配。
标题中你的问题的答案是:你还能如何找到价值呢?除非您对数组的结构有一些额外的了解,否则迭代它是找到值的唯一方法。如果您确实知道一些额外的东西,例如数组是排序的,那么您可以做一些更有效的事情,例如二进制搜索。但在最坏的情况下,你需要迭代整个数组,在平均情况下,超过数组的一半。
现在,关于您发布的代码:这段代码并不试图找到一个值。它不是想找到任何东西,真的。它已经知道了它想要处理的索引,根本不需要迭代。
然而,有时候,做额外的工作是有正当理由的。例如,在安全敏感的应用程序中,完成某些工作所需的时间可能会泄漏有关数据的信息。(这被称为定时攻击,这是更一般的侧通道攻击的特例。)例如,当字符串比较发现字符串之间的第一个差异时,它通常会中止并返回false。然而,这意味着攻击者可以,例如,确定密码开头有多少个字符是正确的,从而降低了蛮力的复杂性--迫使密码从** (即指数复杂度)降至*(即多项式复杂度)。
因此,这将是一个示例,在这个例子中,您总是需要遍历整个数组,并且不能提前中止,因为无论在哪里发生差异,您都需要花费相同的时间。
不过,情况似乎并非如此。
https://softwareengineering.stackexchange.com/questions/302830
复制相似问题