這可能是一個(gè)非常廣泛的問(wèn)題。我想創(chuàng)建一種表示字符串的方法,該方法支持 O(1) 追加、O(1) 向左追加和 O(1) 比較,同時(shí)保持 O(N) 切片和 O(1) 索引。我的想法是,我將 unicode 字符存儲(chǔ)為其 unicode 編號(hào),并使用數(shù)學(xué)運(yùn)算從兩端添加和刪除字符。我將其命名為“NumString”:class Numstring: def __init__(self, init_str=""): self.num = 0 self.length = 0 for char in init_str: self.append(char) def toString(self, curr=None): if curr is None: curr = self.num retlst = [] while curr: char = chr(curr % 10000) retlst.append(char) curr = curr // 10000 return "".join(retlst) def appendleft(self, char): assert len(char) == 1 self.num *= 10000 self.num += ord(char) self.length += 1 def append(self, char): self.num += ord(char)*(10000**self.length) self.length += 1 def pop(self): # self.num = self.num % (10000**self.length-1) self.num = self.num % 10000**(self.length-1) self.length -= 1 def popleft(self): self.num = self.num // 10000 self.length -= 1 def compare(self, numstring2): return self.num == numstring2.num def size(self): return self.length def get(self, start, end=None): if start >= self.length: raise IndexError("index out of bounds") if end and end > self.length + 1: raise IndexError("index out of bounds") if end is not None: if start == end: return "" curr = self.num curr = curr // (10000 ** start) curr = curr % 10000**(end) return self.toString(curr) else: curr = self.num curr = curr // (10000 ** start) char = chr(curr % 10000) return char
1 回答

慕桂英546537
TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
int
s 本質(zhì)上表示為數(shù)字字符串(基數(shù)高于 10),對(duì)它們進(jìn)行的大多數(shù)操作(包括加法和乘法)所花費(fèi)的時(shí)間與它們包含的數(shù)字?jǐn)?shù)量成正比,甚至更糟。由于您使用的基數(shù) (10000) 與基數(shù)int
的使用不匹配,因此乘以或除以基數(shù)等操作會(huì)變成復(fù)雜的操作,而不是簡(jiǎn)單地復(fù)制內(nèi)存字節(jié)。因此,它幾乎是對(duì)已經(jīng)執(zhí)行的操作字符串的效率較低的重新實(shí)現(xiàn)(這是您通過(guò)基準(zhǔn)測(cè)試發(fā)現(xiàn)的),并且它不支持所有 Unicode(最高可達(dá) 0x10FFFF,而不是 10000)。
不過(guò),提示實(shí)際上具有您正在尋找的屬性的數(shù)據(jù)結(jié)構(gòu):基于循環(huán)緩沖區(qū)的雙端隊(duì)列。
添加回答
舉報(bào)
0/150
提交
取消