簡體   English   中英

合並和排序O(n)中的n個字符串

[英]Merging and sorting n strings in O(n)

最近,我在編碼挑戰中遇到一個問題,我必須合並n個字母數字字符的字符串,然后對新的合並字符串進行排序,而只允許在排序的字符串中使用字母字符。 現在,這將是相當簡單的,除了增加的警告是算法必須為O(n)(它沒有指定這是時間還是空間復雜性,還是兩者都沒有)。

我最初的方法是將字符串連接成一個新字符串,只添加字母字符,然后在末尾排序。 我想提出一個更有效的解決方案,但是給我的時間少於最初告訴我的時間。 (我所知道的)沒有在O(n)時間內運行的排序算法,所以我唯一能想到的是我可以增加空間復雜度並使用排序的哈希表(例如C ++映射)進行存儲每個字符的計數,然后按排序順序打印哈希表。 但這可能需要n次打印n個字符,因此我認為它仍將以二次時間運行。 另外,我使用的是python,但我認為它沒有辦法使字典保持排序(也許可以)。

無論如何,是否可以在O(n)時間和/或空間復雜度中解決此問題?

您的計數排序要走的路:建立了26個字母的簡單計數表中的順序。 遍歷兩個字符串,計算字母,忽略非字母。 這是O(n)的一遍。 現在,只需遍歷表格,按指示的次數打印每個字母。 這也是O(n),因為計數的總和不能超過n 您不會每次打印n字母n總共要打印n字母。

  1. 連接您的字符串(不是真正需要的,您也可以在單個字符串中計算字符)
  2. 創建一個長度等於字符代碼總和的數組
  3. 通讀您的串聯字符串,並計算在步驟2中創建的數組中的出現次數
  4. 通過讀取char freq數組,使用每個char的正確nr個重復構建輸出數組。

因為每個步驟都是O(n),所以整個事情都是O(n)

[@patatahooligan:在我看到您的評論之前進行了此編輯,不小心重復了答案]

如果我正確理解了要求,那么您只是在對字符串中的字符進行排序?

ADFSACVB變為AABCDFSV

如果是這樣,那么訣竅就是不要真正“排序”。 您有固定數量的值。 因此,您只需對每個值進行計數並從中生成結果。

例如,鑒於ABACBA

在第一遍中,在由字符索引的數組中增加一個計數器。 這將產生:

[A] == 3
[B] == 2
[C] == 1

在第二遍輸出中,計數器指示的每個字符的編號。 AAABBC

總而言之,系統會告訴您進行排序 ,但要跳出框框思考,您確實需要計數算法。

暫無
暫無

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

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