给定一个包含随机数的长度列表。
什么方法需要最少的检查才能找到列表中最大和最小的数字?
我最好的猜测是:(list_length)/2 支票数量。
如果您比较第一项和最后一项,然后比较第 2 项和最后一项,依此类推,因为它使您一次检查列表中的 2 个数字,然后使用最大和最小的索引更新 2 个变量数字。
有没有更好/更快/更有效的方法?
给定一个包含随机数的长度列表。
什么方法需要最少的检查才能找到列表中最大和最小的数字?
我最好的猜测是:(list_length)/2 支票数量。
如果您比较第一项和最后一项,然后比较第 2 项和最后一项,依此类推,因为它使您一次检查列表中的 2 个数字,然后使用最大和最小的索引更新 2 个变量数字。
有没有更好/更快/更有效的方法?
让我们谈谈找到最小值(或仅最大值)。
如果是列表的大小(未排序),您将有比较和访问列表(如果您存储值)。
这是因为数字没有排序。所以你必须比较给定列表中的所有数字。第一个和最后一个,然后是它们中的最小值和第二个,它们中的最小值等等。
您必须将局部最小值与所有未检查的值进行比较,否则您将错过结果。
现在,您可以通过限制列表来减少这个数字。如果您事先知道最小值和/或最大值是多少(例如所有自然数)。您事先知道,如果您找到一个 0,它将自动成为列表中的最小数字。无需继续检查。
因此,在未排序的列表中,没有更有效的方法可以将所有数字与找到的最新最小值进行比较。或者你会做出假设,你可能会弄错。
另外,查看这篇关于找到数组的最小值和最大值的好文章。
如果您想要确切的最小值/最大值,最有效的算法是存储它们的估计值并在数组上循环,将它们的值与数组中的每个值进行比较,并在发现某个值更小/更大时更新它们的值。如果没有额外的假设,您无法查看更少的元素,因为假设您确定性地选择要查看的数组子集。对手可以看到您将查看阵列的哪些部分,然后将最小值/最大值放置在这些阵列部分之外。作为算法制造者,击败对手的唯一方法是在确定找到最小值/最大值之前查看整个数组。
如果您可以允许错误,您总是可以尝试通过选择更小的随机元素子集来估计最小值/最大值,例如大小,然后循环这个较小的集合并计算最小值/最大值并以此作为估计。当然,您犯错的可能性很大,但也许最终对您的应用程序来说是可以的。您还可以研究更复杂的流算法以找到近似技术。