簡體   English   中英

用於搜索三元組字符串的最有效的Java數據結構

[英]most efficient Java data structure for searching triples of strings

假設我有一個很大的字符串三元組列表(大約10,000個條目),例如:

car    noun    yes
dog    noun    no
effect noun    yes
effect verb    no

假設為我提供了一個雙精度字符串-例如,(效果,動詞),並且我需要快速查看列表以查看該對是否出現,如果確實出現,則其值為yes或no。 (在此示例中,確實出現了雙精度,並且值為“ no”。)

Java中用於存儲列表的最佳數據結構是什么以及執行搜索的最有效方法是什么? 我正在執行數十萬次此類搜索,因此速度至關重要。

謝謝!

您可能考慮使用HashMap<YourDouble, String> 搜索將為O(1)。

您可以創建一個對象,即保存前兩個值的YourDouble,也可以將一個附加到另一個(如果值仍然是唯一的)之后,然后使用HashMap<String, String>

我將為每種想要的搜索類型創建一個HashMultimap ,例如“所有三個”,“每個對”和“每個單個字段”。 構建列表時,填充所有不同的地圖,然后可以從適合您查詢的任何地圖中獲取。

(不利之處在於,至少每個Arity都需要一種類型,例如,對於“單場”地圖僅使用String,對於兩場地圖僅使用Pair ,對三場地圖使用Triple 。)

您可以使用HashMap ,其中的鍵是前兩個字符串(用於查找的字符串)的連接,並且值是布爾值,表示yesno字符串。

另外,第二列中的單詞似乎會更少,因為它們代表類別。 您可能有一個HashMap<String, HashMap<String, Boolean>> ,其中您首先通過“名詞”,“動詞”等進行索引,然后通過例如“ car”,“ dog”,“ effect”進行索引以獲得給你的布爾值。 這可能會更節省空間。

10k在我看來並不大。 您嘗試過數據庫嗎?

查找此類信息的地方是語義網 許多項目都在這種類型的Triple Stores上工作。 實現的“三重存儲”頁面底部有一個列表。

就Java而言,您的算法幾乎肯定會依賴於語言,如果您發現用C實現的良好算法,其Java端口也將很快。

另外,您的數據集是什么樣的? 是否有很多2個匹配項,使得主語和動詞經常相同? 您希望獲得多少場比賽? MapReduce在查找10k中的一個匹配項時會很好地工作,但是執行返回8k的10k的查詢(其中查詢不容易分區)時,MapReduce效果不佳。

也有專門針對此問題的查詢語言: SPARQL 盡管10k似乎還沒有那么大,但bigdata博客有一些不錯的見解。

暫無
暫無

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

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