0
在每一段代碼我看了網上或書,說如果有人想計算S和E之間的中點,他們這樣做:爲什麼用這種方式計算二分搜索索引?
int mid = s + ((e - s)/2);
數學這不就是一回事
int mid = (s + e)/2;
那麼爲什麼它經常以第一種方式寫?我的猜測是防止整數溢出,但不確定。
由於
在每一段代碼我看了網上或書,說如果有人想計算S和E之間的中點,他們這樣做:爲什麼用這種方式計算二分搜索索引?
int mid = s + ((e - s)/2);
數學這不就是一回事
int mid = (s + e)/2;
那麼爲什麼它經常以第一種方式寫?我的猜測是防止整數溢出,但不確定。
由於
如果e接近最大值爲整數,則可以(s+e)/2
溢出,但s+(e-s)/2
不能(假設s
非負)。
例如(MAX_INT-2 + MAX_INT)
== -4
,所以(MAX_INT-2 + MAX_INT)/2
== -2
您得到了正確的答案。實際上,有些代碼確實使用'(s + e)/ 2',但是,它可能會導致整數溢出問題。 –
由於整數分割的原因,它們是不一樣的。 –
@EdHeal問題只是溢出。只要's'和'e'都是正值,那麼在該部門中的四捨五入就是一樣的。 –