代码之家  ›  专栏  ›  技术社区  ›  Srikar Appalaraju Tonetel

查找字符串序列中的间隙

  •  6
  • Srikar Appalaraju Tonetel  · 技术社区  · 14 年前

    我有一系列的线索- 0000001, 0000002, 0000003.... 高达200万。它们不是相邻的。意思是有差距。假设在0000003之后,下一个字符串可能是0000006。我需要找出所有这些差距。在上述情况下(00000040005)。

    这就是我到目前为止所做的-

    gaps  = list()
    total = len(curr_ids)
    
    for i in range(total):
        tmp_id = '%s' %(str(i).zfill(7))
        if tmp_id in curr_ids:
            continue
        else:
            gaps.append(tmp_id)
    return gaps
    

    但正如你所料,这是缓慢的,因为我正在使用 list . 如果我使用 dict ,预填充curr_id会更快。但是填充哈希表的复杂性是什么呢?最快的方法是什么。

    4 回复  |  直到 14 年前
        1
  •  10
  •   Gareth Rees    14 年前

    您可以对ID列表进行排序,然后仅单步执行一次:

    def find_gaps(ids):
        """Generate the gaps in the list of ids."""
        j = 1
        for id_i in sorted(ids):
            while True:
                id_j = '%07d' % j
                j += 1
                if id_j >= id_i:
                    break
                yield id_j
    
    >>> list(find_gaps(["0000001", "0000003", "0000006"]))
    ['0000002', '0000004', '0000005']
    

    如果输入列表已按顺序排列,则可以避免 sorted (尽管危害不大:Python的 adaptive mergesort 是O( n个 )如果列表已经排序)。

        2
  •  3
  •   Michał Niklas    14 年前

    用于存储可使用的200万个整数的序列 bitarray . 这里,每个位表示一个整数(位数组中该索引的整数)。示例代码:

    gaps = []
    # bitarray is 0 based
    a = bitarray.bitarray(total + 1)
    a.setall(False)
    for sid in curr_ids:
        a[int(sid)] = True
    for i in range(1, total):
        if not a[i]:
            gaps.append('%07d' %(i))
    return gaps
    
        3
  •  1
  •   jairajs89    14 年前
    seq = *the sequence of strings*
    n = 2000000
    
    gaps = set(str(i).zfill(7) for i in range(1,n+1)) - set(seq)
    
        4
  •  0
  •   Rafi    14 年前

    我建议将其改为int而不是string进行处理,然后在输出中再次将其改为string

    j=0
    n=2000000
    #create a list of int number from your string
    foo = [i for i in range(n)]
    #creating gaps
    foo.remove(1)
    foo.remove(50)
    while j<n:
        for i in foo:
            if i>j:
                print '%07d'%j
                j+=1
            j+=1