簡體   English   中英

在不到O(n)的時間內找到交換元素?

[英]Finding swapped elements in less than O(n) time?

給定一個已排序的數組,兩個元素從左半部分交換到另一個從右邊交換,找到交換的元素。

答案在O(n)中是顯而易見的,但是我想知道在O(log n)中是否可能?

由於可以保證交換的元素形成不同的數組一半(“左半邊一個,右半邊一個”):

  1. 首先,我們可以簡單地遍歷數組的前半部分,以尋找O(n/2) = O(n)的交換元素

  2. 然后我們可以使用此交換元素在數組的后半部分中以O(log n/2) = O(log n)進行二進制搜索。

因此,它仍然是O(n) + O(log n) = O(n) ,但實際上它可能比幼稚的方法快一點。

沒有完全掃描左半部分或右半部分是不可能的。 所有未交換的元素都與已排序數組中的元素保持相同,因此它們無法為您提供尋找交換元素的線索,這是O(logN)二進制搜索之類的基礎。

因此,沒有什么比O(N)更好的了。

如果交換的元素是鏡像的(即,左手的第三個元素-開頭,右手的第三個元素-結尾),則可以執行以下操作:

  1. 分成兩半並掃描左半部分,找到異常值
  2. 通過減去int rightOutlierIdx = arr.length - 1 - firstOutlierIdx計算右側離群值的索引
  3. 通過arr[rightOutlierIdx]獲取第二個離群值

應該更快

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM