Jas*_*son 12 algorithm analysis
我现在一直在考虑这个家庭作业问题.给定大小为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]
}
Run Code Online (Sandbox Code Playgroud)
我的问题是循环的每次迭代都有三种可能性之一:
因此,对于整个数组遍历,最多可以进行2n次比较,这与1.5n比较的问题最大要求相差甚远.
ElK*_*ina 21
从一对数字开始,找到本地最小值和最大值(n/2比较).接下来,从n/2个局部最大值(n/2个比较)中找到全局最大值,并从局部分钟(n/2个比较)中找到类似的全局最小值.总比较:3*n/2!
For i in 0 to n/2: #n/2 comparisons
if x[2*i]>x[2*i+1]:
swap(x,2*i,2*i+1)
global_min = min( x[0], x[2], ...) # n/2 comparisons
global_max = max( x[1], x[3], ...) # n/2 comparisons
Run Code Online (Sandbox Code Playgroud)
请注意,上述解决方案会更改阵列.替代解决方案:
Initialize min and max
For i = 0 to n/2:
if x[2*i]<x[2*i+1]:
if x[2*i]< min:
min = x[2*i]
if x[2*i+1]> max:
max = x[2*i+1]
else:
if x[2*i+1]< min:
min = x[2*i+1]
if x[2*i]> max:
max = x[2*i]
Run Code Online (Sandbox Code Playgroud)