中查看任一方向假設您有一個詞典,它將從AA到BB的單詞。這些單詞按AA的字母順序排序(也就是說,所有的單詞都按AA排序,並且它們在BB中的相應單詞由它們正確排列)。是否可以設計方法find_BB()和find_AA()分別在AA和BB中取詞,並分別返回在O(logn)時間內運行的BB和AA中的相應單詞?我知道這是至少可能的find_BB()如果單詞排序的AA,因爲那麼我們可以使用二進制搜索找到相應的BB(我們知道這在O(logn)時間運行)。但是,我似乎無法想出一種方法來安排允許對find_BB和find_AA進行O(logn)查找的字典。它甚至有可能嗎?給出一種預處理方法,允許您在O(logn)
0
A
回答
0
你在問你是否可以有一張允許向前和向後查找的地圖。這可以通過保存兩張地圖來完成:一張從AA到BB,另一張從BB到AA。如果您使用排序列表來實現映射,那麼您的查找都是O(log n),或者如果您使用兩個散列表,則兩個查找都是O(1)。
+0
我不禁要提到,使用String鍵映射哈希表不是最有效的數據結構。在散列表中搜索的分攤成本爲O(1)。沒有考慮到字符串比較的非恆定成本。有爲這個特定任務設計的結構 - [嘗試](http://en.wikipedia.org/wiki/Trie)和其他基數T恤。 – Aivean 2014-09-22 23:16:08
0
我想提到的第一件事是,在排序的字符串數組中執行二進制搜索將花費超過O(log n),因爲字符串比較本身不是常量。
其次,你沒有發佈任何內存使用限制。嚴格地說,有兩個排序陣列,一個用於AA-> BB,另一個用於BB-> AA將解決您的任務。如果需要,可以將這兩個數組封裝在一個數據結構中。
最後。您是否考慮過更高效的數據結構,如Trie?您可以爲AA和BB中的元素構建單個trie,對於每個存儲最多兩個值的葉子。如果葉子是AA的關鍵字,則存儲相應的BB值(標記爲BB),反之亦然。
相關問題
- 1. 是O(LogN)== O(3LogN)?
- 2. Clang是否允許預處理器==?
- 3. 查找RBTREE在O(LOGN)的算法
- 4. 不C#允許預處理指令不同的解決方案
- 5. 允許在Fortify中處理SQL注入的方法
- 6. 一種允許在Windows中以某種方式進行clobbering的方法?
- 7. O(logn)時間和算法關係
- 8. 預處理不允許「:」在令牌宏來定義屬性
- 9. 時間複雜度:O(logN)或O(N)?
- 10. 比較O((logn)!)和O(2^n)
- 11. 在O(logn)O(logn)刪除和索引訪問的數據結構
- 12. 如何處理異步I/O方法
- 13. BIg O符號:n * logn
- 14. 想出一種算法,O(n)的
- 15. 處理中不允許的靜態方法?
- 16. 如何處理Http Error 405方法不允許?
- 17. spark rest api/api/v1給出了不允許的方法
- 18. CSS預處理器也許?
- 19. 是否存在處理預處理器指令並給出實際預處理器輸出的工具?
- 20. 哪種方法允許resharper傳輸方法主體
- 21. 我想實施一種方法,允許我準備測試
- 22. 與NSubstitute使用同一方法是否允許多種安排?
- 23. 查找第n個fib數,在O(logn)
- 24. Yii2方法不允許。此URL只能處理以下請求方法:POST
- 25. 哪一個更好? O(n^1/2)或O(logn)
- 26. 通過O(logn)訪問和O(logn)插入實現數據結構?
- 27. 允許的最大PHP-Postgres預處理語句?
- 28. Java EE 1.5 Servlet - http方法OPTIONS給出了「405方法不允許」
- 29. 訪問控制允許方法不允許刪除方法angularjs
- 30. Symfony2的路由:不允許的方法(允許:(方法})
我不明白這種情況。 「從AA到BB的字典」是什麼意思?AA和BB是什麼?話?詞集?我最好的猜測是你想要通過這兩個元組對索引字對進行索引。在這種情況下,您可以添加冗餘。複製陣列並按AA排列其中一個副本,另一個由BB – 2014-09-22 22:57:34
@NiklasB排序。這就是他的意思,他有一種哈希映射,通過集合AA中的單詞對集合BB中的單詞進行索引。如果AA和BB不相交,爲什麼不存儲這兩個詞典的聯合。如果不是,則只需將兩個字典存儲爲兩種映射方式即可。 – 2014-09-22 23:01:04
@AshuPachauri你怎麼知道這是什麼意思? – 2014-09-23 00:05:01