簡體   English   中英

將字符串插入已排序的數組字符串列表中的最有效方法是什么?

[英]What's the most efficient way to insert a string into an already-sorted array list of strings?

我有一個ArrayList,里面有17,000個單詞。 我只需要在列表中添加一個單詞,如果它還沒有,我需要保留列表的排序順序。 即,我需要將其放入按字母順序排列的正確位置。

我不知道如何找到插入它的正確位置。 我正在使用二進制搜索來查找該單詞是否已經在列表中,如果它在那里則返回索引,如果不是則返回-1。 我打算使用ArrayList.add(int index,E element)將其放入。

ArrayList轉換為TreeSet http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html

TreeSet將為您處理重復項,並按字母順序保留單詞。

示例:( WordList是單詞的ArrayList

TreeSet<String> WordSet = new TreeSet<String>(WordList);

使用內置的binarySearch方法。 如果找不到密鑰,則返回的是
-(insertionIndex) - 1

想到二進制搜索 ,列表api可能包含更好的內容

在二進制搜索中,您將到達剩下2個項目的位置,一個位於上方,一個位於下方,其中一個可能==指向您的項目。 對於您的情況,您將沒有==大小寫,因此返回較高的索引並插入其位置。 我不知道java是否有元組類,或者你可以構建一個容器。 無論哪種方式,返回類似的東西:

(bool, int) binSearch(IList list)
  returns true, -1 if found
  returns false, higher of 2 bounds otherwise

顯然這不是java,但它不是一個延伸轉換

如果您編寫了二進制搜索,則可以對其進行修改以返回搜索到的最后一個值。 此值可以是匹配字符串的位置,也可以是應插入的位置。

這是在二進制搜索中,您細分列表,直到您找到該字符串或無法進一步細分它。 您不能再細分列表的位置是應插入字符串的位置。

為了強化一個過程,我們都知道,一般的想法就是使用更多的內存。 這里,它可以是每個字母的第一個字符串的索引。 例如,另一個ArrayList,寫入偽:

ArrayList indexes;
indexes[0] = {"a", 0};
indexes[1] = {"b", 123};
...

對於以“a”開頭的字符串,您可以在索引0-123之間進行二進制搜索。

如果沒有重復的話,正如你所說,你可以考慮實施一個特里 對trie的插入操作比哈希表中的插入操作要快一些,因為沒有沖突。 搜索也是如此。

此外,在ArrayList中,要在列表中間插入元素,這意味着重新定位元素的一半或增加數組大小,這可能有些昂貴。

如果您很好奇,可以在以下頁面中看到實現: https//forums.oracle.com/forums/thread.jspa?messageID = 8877521

暫無
暫無

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

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