ฉันกำลังมองหาการใช้งาน String Trie ที่มีประสิทธิภาพ ส่วนใหญ่ฉันพบรหัสเช่นนี้:
การใช้งานอ้างอิงใน Java (ต่อวิกิพีเดีย)
ฉันไม่ชอบการใช้งานเหล่านี้ด้วยเหตุผลสองประการ:
- รองรับอักขระได้เพียง 256 ตัวเท่านั้น ฉันต้องครอบคลุมสิ่งต่าง ๆ เช่นไซริลลิก
- พวกเขาไม่มีประสิทธิภาพหน่วยความจำอย่างมาก
แต่ละโหนดมีอาร์เรย์ของการอ้างอิง 256 รายการซึ่งเป็น 4096 ไบต์บนเครื่อง 64 บิตใน Java แต่ละโหนดเหล่านี้สามารถมีโหนดย่อยได้มากถึง 256 โหนดโดยมี 4096 ไบต์สำหรับการอ้างอิงแต่ละโหนด Trie แบบเต็มสำหรับสตริงอักขระ ASCII 2 ทุกตัวจะต้องมีขนาดเกิน 1MB สามสายอักขระ? 256MB สำหรับอาร์เรย์ในโหนดเท่านั้น และอื่น ๆ
แน่นอนว่าฉันไม่ได้ตั้งใจที่จะมีสายอักขระทั้งหมด 16 ล้านสายใน Trie ของฉันดังนั้นพื้นที่ว่างจำนวนมากจึงสูญเปล่า อาร์เรย์เหล่านี้ส่วนใหญ่เป็นเพียงการอ้างอิงที่เป็นโมฆะเนื่องจากความจุของพวกมันมีจำนวนเกินกว่าจำนวนคีย์ที่แทรก และถ้าฉันเพิ่มยูนิโค้ด, อาร์เรย์จะมีขนาดใหญ่ขึ้น (ถ่านมีค่า 64k แทนที่จะเป็น 256 ใน Java)
มีความหวังในการสร้างคู่ชีวิตที่มีประสิทธิภาพสำหรับสายอักขระหรือไม่? ฉันได้พิจารณาการปรับปรุงสองสามอย่างเกี่ยวกับการใช้งานประเภทนี้:
- แทนที่จะใช้อาเรย์ของการอ้างอิงฉันสามารถใช้อาเรย์ของประเภทจำนวนเต็มดั้งเดิมซึ่งดัชนีลงในอาร์เรย์ของการอ้างอิงไปยังโหนดที่มีขนาดใกล้เคียงกับจำนวนของโหนดจริง
- ฉันสามารถแบ่งสตริงออกเป็นส่วน 4 บิตซึ่งจะช่วยให้แถวลำดับขนาด 16 ที่ราคาของต้นไม้ลึก