【发布时间】:2012-02-18 22:46:12
【问题描述】:
我一直在思考这个家庭作业问题。给定一个大小为 n 的数字数组,设计一个算法,通过最多 1.5n 次比较找到高值和低值。
我的第一次尝试是
int high=0
int low= Number.MaxValue //problem statement is unclear on what type of number to use
Number numList[0 . . n] //number array, assuming unsorted
for (i=0, i < n, i++) {
if (numList[i] > high)
high = numList[i]
else if (numList[i] < low)
low = numList[i]
}
我的问题是循环的每次迭代都有以下三种可能性之一:
- 发现低值 - 进行了 1 次比较
- 发现高值 - 进行了 2 次比较
- 均未找到 - 进行了 2 次比较
所以对于整个数组的遍历,最多可以进行 2n 次比较,这与问题最大要求 1.5n 次比较相差甚远。
【问题讨论】:
-
在这类问题中,最好的起始值是第一个元素。
-
@wildplasser,你的意思是用第一个元素值初始化高低吗?
-
是的。这样可以避免选择任意的 {lower,higher}-than-possible sentinel 值。 “空数组”的情况总是很特殊(它没有没有最低,最高)