[英]Time complexity of finding 3 smallest elements in less than O(n) comparisons
[英]Finding swapped elements in less than O(n) time?
給定一個已排序的數組,兩個元素從左半部分交換到另一個從右邊交換,找到交換的元素。
答案在O(n)中是顯而易見的,但是我想知道在O(log n)中是否可能?
由於可以保證交換的元素形成不同的數組一半(“左半邊一個,右半邊一個”):
首先,我們可以簡單地遍歷數組的前半部分,以尋找O(n/2) = O(n)
的交換元素
然后我們可以使用此交換元素在數組的后半部分中以O(log n/2) = O(log n)
進行二進制搜索。
因此,它仍然是O(n) + O(log n) = O(n)
,但實際上它可能比幼稚的方法快一點。
沒有完全掃描左半部分或右半部分是不可能的。 所有未交換的元素都與已排序數組中的元素保持相同,因此它們無法為您提供尋找交換元素的線索,這是O(logN)二進制搜索之類的基礎。
因此,沒有什么比O(N)更好的了。
如果交換的元素是鏡像的(即,左手的第三個元素-開頭,右手的第三個元素-結尾),則可以執行以下操作:
int rightOutlierIdx = arr.length - 1 - firstOutlierIdx
計算右側離群值的索引 arr[rightOutlierIdx]
獲取第二個離群值 應該更快
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.