2014-06-07 22 views
0

我正在尋找兩用陣列(如果有的話!)允許有效提取塊的字符串數據結構?

例如

obj[1] = "Tea"; 
obj[2] = "Coffee"; 
obj[3] = "Cola"; 

數組應該以這樣的方式訪問,不管什麼每個字符串數組的長度,則結果應該pirnted出作爲

obj(5)(1) = "TeaCo" 
obj(5)(2) = "ffeeC" 
obj(5)(2) = "ola" 

我知道,我們可以寫,通過數組循環代碼,並打印出結果如上,但有一個數據結構,它可以直接做到這一點?

+0

你需要更新數組嗎?也就是說,在構建之後,你會寫出例如'obj [1] =「Foobar」嗎?在你的例子中,'obj(5)(2)'有兩個不同的值。這是一個錯字嗎?你想讓'obj(3)(1)'給你''Tea'',還有'obj(3)(2)'給你''Cof'''?您的問題沒有被充分指定。 –

+0

Obj(5)(2)只剩下3個字符,所以會以「ola」結尾,但你理解了我的其餘問題。 – Epigene

+0

在你的例子中,你有'obj(5)(2)=「ffeeC」',後面跟着'obj(5)(2)=「ola」'。如果最後一個是'obj(5)(3)'? –

回答

0

好像您的查詢的形式爲

如果輸入被分成大小爲k的塊,將第r塊是什麼呢?

讓我們調用這種查詢塊查詢(k,r)。

通過使用擴充平衡二叉樹,您可以在時間O(k + log n)中支持這些查詢,其中n是不同字符串的數目。使用左右子樹中的字符總數以及左右子樹中的字符串數量(換句話說,對順序統計樹進行變形)標註樹中的每個節點。此外,通過節點對雙鏈表進行線程化,以便可以在時間O(1)中從任何節點導航到其後繼者。

要在索引i處插入或更新值,請搜索與位置i對應的節點,並在其之前插入新值或更新其內容。

要執行塊查詢(k,r),請使用增強搜索索引爲kr的字符。這需要時間O(log n)。然後,在讀取k個字符之前,請繼續閱讀當前節點中的字符,並根據需要通過鏈接列表遍歷下一個節點。這需要花費時間O(k),如果節點中的平均字符數很少,可能會少很多。

希望這會有所幫助!

+0

您瞭解我的問題,但可以不使用統計樹? – Epigene

+0

@Epigene我不確定。嘗試在數組中的邏輯位置插入和更新字符串時會遇到一些挑戰,而無需在一堆字符上進行洗牌。 – templatetypedef

0

「有沒有可以直接做到的數據結構?」

是的。它是一個字符數組,也被稱爲字符串。

如果您的字符串是"TeaCoffeeCola",那麼(在Java中),string.substring(0,5)"TeaCo"string.substring(5,5)"ffeeC"。等等。

無論您使用何種語言,您都可以輕鬆地爲自己編寫一個函數,從中抽取字符串中的一系列字符。這就是你所需要的。

+0

你將如何使用這個結構來實現像「將第k個字符串設置爲某個新字符串」或「在邏輯位置4插入一個新字符串?」的操作? – templatetypedef

+0

@templatetypedef,我不知道這是一個要求。在這個問題中,你只談論打印切片。如果你使用一個簡單的數組,你將不得不向上或向下複製數組的後綴,如果你想插入或刪除字符。這個性能是否可以接受取決於陣列的大小。 –

+0

@templatetypedef正在尋找正確的方向。我正在尋找一種方法來獲取不同字符串中的合併數據,而不是一個。 – Epigene