{integer_key -> list[tuple]}
キーと値のペアを持つマップがあります。タプルには(start,end)
、部分文字列操作の文字列インデックスを表す値が含まれています。
私の目標は、重複する領域を削除し、キーと値のペアが{tuple -> integer_key}
. より低い範囲にマッピングされた範囲integer_keys
は、より高い範囲よりも優先されます。
以下は、私の現在の実装の実行可能な例です(このordereddictクラスが必要です):
from collections import OrderedDict
string_length = 20
idx_region_map = OrderedDict()
idx_region_map[0] = [(0,2), (7,10)]
idx_region_map[1] = [(4,5), (18,19)]
idx_region_map[2] = [(3,3), (5,6), (10,13)]
idx_region_map[3] = [(15,17), (19,20)]
# Which can be represented as follows:
#
# |012345678901234567890|
# 0|ooo----oooo----------|
# 1|----oo------------oo-|
# 2|---o-oo---oooo-------|
# 3|---------------ooo-oo|
# ...
def filter_overlaps(string_length, idx_region_map):
region_idx_map = {}
occupied = [False for i in range(string_length)]
for idx, regions in idx_region_map.items():
for region in regions:
start, end = region[0], region[1] + 1
overlaps = any(occupied[start:end])
if not overlaps:
for i in range(start, end):
occupied[i] = True
region_idx_map[region] = idx
return region_idx_map
# Prints: {(3, 3): 2, (4, 5): 1, (18, 19): 1, (7, 10): 0, (0, 2): 0, (15, 17): 3}
print filter_overlaps(string_length, idx_region_map)
これは私のニーズに対して十分に機能しているようですが、この問題を解決するためにどのような代替アルゴリズムがあるかを知りたいと思っています. たとえば、異なるデータ構造を使用したり、上記よりも効率的なものを使用したりします。