如何在Google Go中編寫可重用優先級隊列的代碼,或者每次需要優先隊列實現時,預計會定義 Push
和Pop
函數?谷歌go中可重複使用的優先級隊列實現
回答
後面的情況是必須要做的。至於Go沒有泛型,它是目前唯一可用的選項。
在標準庫的container/vector
模塊中使用矢量類型來實現這些方法,基於可調整大小的切片,並且完美地作爲容器與heap
模塊一起使用。不幸的是,他們擺脫了vector
,這是我從來沒有理解的,因爲它通過切片變量實現了一個很好的方法級抽象。因此,現在,每當我看到有人在Go中使用堆模塊時,他們都必須基本重新實現部分vector
- 根據切片變量編寫Push
,Pop
,Length
等。
然後'container.Vector'也被[SliceTricks](http://code.google.com/p/go-wiki/wiki/SliceTricks)的b/c所廢棄。另一個原因是'Vector'只支持3種類型('int','string','interface {}'),但引用的技巧可以用於任何類型的任何靜態類型安全的程序: – zzzz
@jnml:您沒有閱讀我所說。 'heap'算法需要一個類型爲'Push','Pop','Len','Less'和'Swap'的方法。 'Vector'已經包含了所有這些。 SliceTricks沒有幫助。 – newacct
還沒有嘗試過,但也許你可以使用反射和結構標籤,如果你的情況發生適合某些限制。你會要求你的heapable類型是一個帶有標籤的結構,比如用於排序的字段上的`pq:「Key」`,並且該類型的字段類型爲<。它比Less方法強大得多,但它可能會滿足您的需求。
對不起,我沒有你的例子代碼。我認爲這不會很難,但這需要我一些時間。留下鍛鍊。
如果我有一種情況需要處理任意結構,並且我可以忍受簡單的關鍵限制,那麼我可以嘗試這種技術。對於有限類型的集合,我不會這樣做。我只是通過本書來實現,爲每種類型分別實施堆接口。這不是那麼多的工作,也沒有那麼多的代碼。
我不確定我是否理解這個問題。
我使用的接口{}作爲存儲類型在這裏實現一個隊列(和堆棧和環):
https://github.com/iNamik/go_container
使用接口{}允許你保存你想要的任何類型的 - 儘管它不能幫助你執行類型ala泛型,它會完成工作。
我可以看到創建優先隊列沒有太多麻煩。
我錯過了什麼嗎?
我很樂意添加一個優先級隊列容器,如果你認爲你會發現它有用。
- 1. Go中的優先隊列實現
- 2. 實現Java的優先級隊列
- 3. 優先級隊列中的優先級
- 4. Java優先級隊列接口實現
- 5. 堆優先級隊列實現
- 6. 多向優先級隊列實現
- 7. Python實現優先級隊列
- 8. 雙重優先級隊列
- 9. 優先級隊列,可比
- 10. 實現可以在C++中迭代的優先級隊列
- 11. 在STL優先級隊列中實現decreaseKey隊列C++
- 12. PHP優先隊列實現
- 13. 優先隊列堆實現
- 14. Brodal優先隊列實現
- 15. 優先隊列實現
- 16. R中用於OPTICS的優先級隊列的實現
- 17. 優先級隊列
- 18. 使用優先級隊列實現Dijkstra算法
- 19. 使用堆棧實現優先級隊列
- 20. 使用min堆實現優先級隊列
- 21. 使用只有一個堆棧實現優先級隊列
- 22. Java中的優先級隊列中斷刪除重複元素
- 23. 請介紹如何使用優先級隊列來實現隊列
- 24. 如何優先使用循環隊列在C++中實現隊列實現?
- 25. 使用鏈表的優先級隊列
- 26. 爲什麼此優先級隊列實現只重複打印一個值?
- 27. 在Kannel中實現優先隊列
- 28. 的Java:優先級隊列
- 29. Haskell中優先級隊列實現的比較
- 30. 優先級隊列實施堆
我記得Go發佈時有一定程度的分歧,語言bultins是通用的,但是沒有辦法寫自己的。 C++程序員期待地球;-) –