用于存储具有相对排序的数据的高效数据结构

时间:2016-07-22 03:38:41

标签: python performance data-structures collections

我必须将一个句子连同句子的可能部分存储到一个有效的数据结构中。目前,我使用字典后跟列表中的每个键来存储段。我可以使用更好的数据结构来有效地存储相同的数据结构。我已详细说明了以下所有要求。

Input sentence with possible candidate segments

这里,句子以pravaramuku.........yugalah开头,没有任何背景颜色。编号为1到24的每个彩色框都是句子的一部分。

现在我存储以下内容如下

class sentence:
      sentence = "pravaramuku....."
      segments = dict()

键是相对于句子的框的起始位置,值是存储每个框的详细信息的对象。

    segments = {0: [pravara_box1, pravara_box10], 
7:[mukuta_box2], 
13:[manim_box3,maninm_box11,mani_box19,mani_box_25],...........}

如果其中一个方框的key位于另一个方框的keykey+len(word in box)之间(范围包括在内),则认为有两个方框存在冲突。例如,方框7和方框15是相互矛盾的,方框3和方案11也是如此。

在该计划中,其中一个方框将被选为胜利者,由魔术方法决定。选择获胜者后,将删除其冲突的框。再次选择另一个框,这将迭代地继续,直到没有框为止。

现在,正如您所看到的,我的数据结构是一个字典,每个键都有一个列表作为其值。

处理此问题的更好的数据结构是什么,因为目前消除冲突的节点部分需要花费大量时间。

我的要求可归纳如下:

  • 可以存储以下数据的高效数据结构,以便加快处理速度。

  • 需要存储每个盒子的相对位置。是否有更好的方法来明确标记冲突的节点(可能与C中的指针类似)

  • 这是一棵树,但是没有连续的顺序遍历,因为需要随机访问box,即需要调用任何框(使用O(1))而不是从一个遍历到另一个。

  • 数据结构的创建是一次性操作,因此整个插入过程可能需要时间,但是访问盒子和消除冲突的节点需要重复进行,因此需要加速。

任何可以部分解决我的问题的帮助都表示赞赏。

1 个答案:

答案 0 :(得分:1)

似乎你可以在正确构建的树上进行回溯深度优先搜索:

sentence = "pravaramuku.........yugalah"
words = sentenceToWords(sentence)  # it seems like you already have this

tree = collections.defauldict(list)
for word in words:
    for i in (i for i in range(len(sentence)) if sentence[i:i+len(word)] == word):
        tree[i].append(word)

完成后,您只需要对树进行深度优先遍历:

def makeSentences(tree, pos=None, sofar=None):
    if pos is None: pos = 0
    if sofar is None: sofar = []
    if pos not in tree: print(' '.join(sofar))
    for word in tree[pos]:
        makeSentences(tree, pos+len(word), sofar+[word])

然后:

makeSentences(tree)