Bạn có thể tạo ra tất cả các chuỗi con trước thời hạn, và bản đồ chúng phím tương ứng của họ.
#generates all substrings of s.
def genSubstrings(s):
#yield all substrings that contain the first character of the string
for i in range(1, len(s)+1):
yield s[:i]
#yield all substrings that don't contain the first character
if len(s) > 1:
for j in genSubstrings(s[1:]):
yield j
keys = ["New York", "Port Authority of New York", "New York City"]
substrings = {}
for key in keys:
for substring in genSubstrings(key):
if substring not in substrings:
substrings[substring] = []
substrings[substring].append(key)
Sau đó, bạn có thể truy vấn substrings
để có được các phím có chứa chuỗi con rằng:
>>>substrings["New York"]
['New York', 'Port Authority of New York', 'New York City']
>>> substrings["of New York"]
['Port Authority of New York']
Ưu điểm:
- nhận được chìa khóa của chuỗi là nhanh như truy cập vào một từ điển.
Nhược điểm:
- Tạo
substrings
gánh chịu một chi phí một lần vào đầu chương trình của bạn, dành thời gian tỉ lệ với số phím trong programs
.
substrings
sẽ tăng xấp xỉ tuyến tính với số lượng khóa trong programs
, tăng mức sử dụng bộ nhớ của tập lệnh của bạn.
genSubstrings
có hiệu suất O (n^2) liên quan đến kích thước khóa của bạn. Ví dụ, "Port Authority của New York" tạo ra 351 chất nền.
Chính xác. Chỉ cần không mong đợi nó được nhanh chóng nếu từ điển của bạn là lớn. –
@MarkRansom Tôi vừa thêm rằng từ điển của tôi khá lớn và dự kiến sẽ lớn hơn. Nó đã được làm 'programs.get ('new york')' cho đến nay đã được rất nhanh. –
Nếu đi qua tất cả các khóa trong từ điển quá chậm đối với ứng dụng của bạn, bạn cần xây dựng một cơ sở dữ liệu được nhắm mục tiêu vào loại truy vấn này. Điều đó có lẽ sẽ là một số loại chỉ số đảo ngược dựa trên từ hoặc một cây hậu tố. – mensi