การผ่อนคลายนั้นถูกต้องเป็นหลักว่ามีหลายวิธีในการใช้ Trie และสำหรับพจนานุกรมสามมิติที่มีขนาดใหญ่ปรับขนาดได้พจนานุกรมที่ซ้อนกันอาจยุ่งยากหรืออย่างน้อยก็ใช้พื้นที่ไม่ได้ แต่เนื่องจากคุณเพิ่งเริ่มต้นฉันคิดว่านั่นเป็นแนวทางที่ง่ายที่สุด คุณสามารถเขียนโค้ดง่ายๆtrie
เพียงไม่กี่บรรทัด ขั้นแรกฟังก์ชั่นในการสร้าง Trie:
>>> _end = '_end_'
>>>
>>> def make_trie(*words):
... root = dict()
... for word in words:
... current_dict = root
... for letter in word:
... current_dict = current_dict.setdefault(letter, {})
... current_dict[_end] = _end
... return root
...
>>> make_trie('foo', 'bar', 'baz', 'barz')
{'b': {'a': {'r': {'_end_': '_end_', 'z': {'_end_': '_end_'}},
'z': {'_end_': '_end_'}}},
'f': {'o': {'o': {'_end_': '_end_'}}}}
หากคุณไม่คุ้นเคยsetdefault
ก็เพียงแค่ค้นหาคีย์ในพจนานุกรม (ที่นี่letter
หรือ_end
) หากมีคีย์อยู่จะส่งคืนค่าที่เกี่ยวข้อง หากไม่เป็นเช่นนั้นจะกำหนดค่าเริ่มต้นให้กับคีย์นั้นและส่งคืนค่า ( {}
หรือ_end
) (มันเหมือนกับเวอร์ชันget
ที่อัปเดตพจนานุกรมด้วย)
ถัดไปฟังก์ชั่นเพื่อทดสอบว่าคำนั้นอยู่ในไตร:
>>> def in_trie(trie, word):
... current_dict = trie
... for letter in word:
... if letter not in current_dict:
... return False
... current_dict = current_dict[letter]
... return _end in current_dict
...
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'baz')
True
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'barz')
True
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'barzz')
False
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'bart')
False
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'ba')
False
ฉันจะปล่อยให้คุณใส่และถอดออกเป็นการออกกำลังกาย
แน่นอนคำแนะนำของ Unwind จะไม่ยากกว่านี้ อาจมีข้อเสียด้านความเร็วเล็กน้อยในการค้นหาโหนดย่อยที่ถูกต้องจะต้องใช้การค้นหาเชิงเส้น แต่การค้นหาจะ จำกัด จำนวนอักขระที่เป็นไปได้ - 27 ตัวหากเรารวม_end
ไว้ด้วย นอกจากนี้ยังไม่มีอะไรจะได้รับจากการสร้างรายการโหนดจำนวนมากและเข้าถึงโดยดัชนีตามที่เขาแนะนำ คุณอาจจะซ้อนรายการ
สุดท้ายนี้ฉันจะเพิ่มว่าการสร้างกราฟคำแบบสลับทิศทาง (DAWG) จะซับซ้อนกว่าเล็กน้อยเนื่องจากคุณต้องตรวจจับสถานการณ์ที่คำปัจจุบันของคุณใช้คำต่อท้ายร่วมกับคำอื่นในโครงสร้าง ในความเป็นจริงสิ่งนี้อาจค่อนข้างซับซ้อนขึ้นอยู่กับว่าคุณต้องการจัดโครงสร้าง DAWG! คุณอาจต้องเรียนรู้บางอย่างเกี่ยวกับระยะ ทางLevenshteinเพื่อให้ถูกต้อง