簡體   English   中英

刪除重復項的好程序

[英]Good Procedure to remove duplicates

我有一個帶有SPACE分隔符的巨大字符串(1GB),我將其轉換為Array []。 我的字符串包含很多重復項。 我必須對字符串進行排序並刪除重復項。 我已經完成了2個過程,但無法在這兩個過程中決定一個。

程序1

我認為排序字符串是一個昂貴的過程,我想使用HashSet刪除重復項,然后進行排序。

程序2

我對數組進行排序,並使用將已排序的數組及其上一個值與下一個值進行比較的正式程序來刪除重復項,並刪除重復項。

從我的角度來看,第一步程序似乎不錯。 但是我不知道是否遇到任何錯誤。 哪個會好..?

假設內存不是問題,從性能角度來看,最有效的方法可能是:

String s = someOneGbString();
String[] words = s.split("\\s+");
Set<String> noDupes = new HashSet<>();
Collections.addAll(noDupes, words);

如果您需要對它進行排序:

Set<String> sorted = new TreeSet<> (noDupes);

或使用Java 8:

Set<String> sorted = Arrays.stream(s.split("\\s+"))
                           .sorted()
                           .collect(toSet());

情況1:內存<〜1GB

您可以使用外部合並排序。 http://en.wikipedia.org/wiki/External_sorting#External_merge_sort

情況2:內存>〜1GB

讀取整個字符串。 將其拆分為一個數組( String[] )。 使用就地快速排序。 遍歷數組,並檢查順序相鄰的字符串是否相同。 由於子字符串不是原始String的副本,而是僅引用String池中的內存位置,因此這將節省空間。

時間復雜度:O(nlogn)

情況3:內存>>〜1GB

按照別人的建議去做。 使用TreeSet或HashSet。 對於TreeSet,每個插入將為O(logn),所以總計為O(nlogn)。 但是,就時間和空間而言,這將不如快速排序有效。 HashSet更復雜,具體取決於哈希函數。 在大多數情況下,它會很好,時間復雜度為O(n)。

暫無
暫無

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

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