二进制斩:如果list [middle] == key case
我正在修改考试的算法,我试图解决这个练习,但我无法想出一个解决方案。
这是伪代码。
1. int search (int [] a, int x) {
2. // Pre: ∃i:Nat (0≤i<a.length ∧ a[i]=x) ∧ a is in ascending order
3. // Post: 0≤ r≤ a.length ∧
4. // ∀i:int.(0 ≤ i < r → a[i] < x) ∧ a[r]=x
5. int left, middle; int right = a.length;
6. if (a[0]>=x) return 0; else left=0; //a[left]<x (a)
7. while ((right-left>1){ (b)
8. // invariant: (I1) 0≤ left < right ≤ a.length ∧
9. // (I2) ∀i:int(0 ≤ i ≤ left → a[i] < x) ∧
10. // (I3) ∀i:int(right ≤ i < a.length → a[i] > x)
11. // (note: a[i]>x not a[i]≥x)
12. // Variant: right-left-1
13. middle = (left+right) / 2; // left < middle < right (*)
14. if ( a[middle]== x) return middle;
15. else {if a[middle)<x) left = middle ;
16. else right=middle;} (c)
17. }
18. } // left+1=right } (d)
因此,现在的代码不满足post条件,因为对于某些输入(例如x = 1和a = {0,1,1,1,1}),第14行返回的值不满足第4行的后置条件。
该练习要求:
“替换”返回中间;“在第14行。通过while循环并返回
代码,以满足后置条件。包括变体和
不变的强大到足以暗示
返回后的后置条件。提示:确保包括说明不会改变的内容。“
我一直无法找到解决方案。
谁能帮我?
提前致谢,
VJ
编辑:
好的,谢谢你们两位的帮助。
while(middle > 0 && a[middle] == x){
middle--;
}
回到中间;
我选择变体是中间的。并且不变量为:
0X
你认为这是对的吗?
没有找到相关结果
已邀请:
2 个回复
疾很毋悲
但这可能很慢,例如当整个a包含相同的值时,它具有线性时间复杂度。
填盖