在陣列中的最小唯一號碼被定義爲 min{v|v occurs only once in the array}
例如,最小唯一編號{1,4,1,2,3}爲2 是否有任何比排序更好嗎?在陣列中找到的最小唯一編號
回答
相信這是O在時間和空間(N)溶液:
HashSet seenOnce; // sufficiently large that access is O(1)
HashSet seenMultiple; // sufficiently large that access is O(1)
for each in input // O(N)
if item in seenMultiple
next
if item in seenOnce
remove item from seenOnce
add to item seenMultiple
else
add to item seeOnce
smallest = SENTINEL
for each in seenOnce // worst case, O(N)
if item < smallest
smallest = item
如果積分值的有限範圍,則可以與由值索引BitArrays更換HashSets。
這是所有偉大的先生,但我在哪裏可以找到這個神奇的O(1)隨機訪問哈希函數?就我(以及世界其他地方)而言,散列函數的「最佳」隨機訪問時間是O(logn)。 – ElKamina 2012-08-14 03:39:55
除非我錯過了一些東西,否則不需要隨機訪問。第一遍循環遍歷'input'(O(N)),並在散列集上進行查找,插入和刪除,每個O(1)。總計:O(N)。第二遍現在寫在'seenOnce'上,但很容易修復:再次循環輸入(O(N)),測試'seenOnce'(O(1))的成員關係,如果它附加了它到一個新的'seenOnceList'(O(1)),總的O(N)。最後對最小值O(N)進行掃描。淨O(N),不是? – DSM 2012-08-14 04:10:15
@ElKamina - 你用一個散列混淆了一棵樹。請參閱http://en.wikipedia.org/wiki/Big_O_notation#Orders_of_common_functions並查看O(1)下的列表。使用大型表格和適當的散列函數,衝突並不重要。 – walrii 2012-08-14 05:47:38
你不需要做完整的排序。執行冒泡排序內部循環,直到你在一端得到不同的最小值。在最好的情況下,這將具有時間複雜度O(k * n),其中k =非明顯最小值的數目。但最壞的情況複雜度是O(n * n)。所以,當期望值爲k時,這可以是高效的。
我認爲這應該是儘可能小的時間複雜度,除非您可以將任何O(n * logn)排序算法適應上述任務。
- 1. Bourne Shell編程:在列表中找到最小/最大編號
- 2. 從陣列中獲取最高但也是唯一的編號
- 3. Crossfilter和DC.js:縮小到唯一編號
- 4. 查找使矩陣中的行有唯一性的列的最小子集
- 5. Python中查找最小值在陣列
- 6. 在矩陣中找到唯一元素
- 7. 尋找最小編號
- 8. Java - 查找最小編號
- 9. 使用C,在N個陣列中查找唯一陣列
- 10. 最小(大小)對象以保存唯一編號?
- 11. 唯一編號列表
- 12. 如何找到最小/最大值由軸在numpy的陣列
- 13. 在陣列中找到的最大值
- 14. 在另一個陣列中查找對應於最小值的陣列
- 15. 在ElasticSearch中添加陣列到陣列的唯一值
- 16. 唯一序列號到列
- 17. JSON:PP唯一編碼在陣列
- 18. 如何在鋸齒陣列中找到唯一值
- 19. 查找最小值在陣列 - C++
- 20. C++中的唯一編號
- 21. 在最後得到唯一編號的網址[VB 2012]
- 22. 如何找到非零最小陣列中的2D矩陣在MATLAB
- 23. 尋找最小的辭典陣列
- 24. 查找最小的Python陣列
- 25. 找到最大編號
- 26. 查找陣列中具有最大度數的最小子陣列的長度
- 27. C#在2D陣列中找到2D小陣列
- 28. 查找的ID,其中的值是唯一的在陣列
- 29. 找出最小的失蹤人數在一個陣列
- 30. 找到最大子陣列
「更好」的意思是「更低的時間複雜度」? – 2012-08-14 01:57:58
@VaughnCato:是的,我想我們能否比O(nlogn)做得更好。 – shilk 2012-08-14 02:00:38
您的數值範圍是有限還是限制?如果它們與限制範圍不可分割,我相信O(N)是可能的。 – walrii 2012-08-14 02:04:45