มีน้อยมากที่ตายบนอินเทอร์เน็ต Archive.org เพิ่งเกิดขึ้นจะมีหนึ่งภาพเพียงภาพเดียวของบล็อกโพสต์ว่าตั้งแต่เมื่อมันเป็นสด คัดลอกที่นี่:
วิทยาศาสตร์คอมพิวเตอร์เพื่อการแก้ไขบางอย่างสำหรับผู้ตรวจสอบ PCI ในกลุ่มผู้ชมของฉัน
ฉันมอบอาร์เรย์ของจำนวนเต็มแบบสุ่มให้คุณ คุณจะบอกได้อย่างไรว่าหมายเลขสามนั้นอยู่ในนั้น?
มีวิธีชัดเจน: ตรวจสอบหมายเลขตามลำดับจนกว่าคุณจะพบ“ 3” หรือทำให้อาร์เรย์หมด การค้นหาเชิงเส้น เมื่อรับตัวเลข 10 ตัวคุณต้องถือว่ามันสามารถทำได้ 10 ขั้นตอน หมายเลข N ขั้นตอน N
รูปที่ 1.png
การค้นหาเชิงเส้นไม่ดี มันยากที่จะทำสิ่งที่เลวร้ายยิ่งกว่าเชิงเส้น มาปรับปรุงกันเถอะ เรียงลำดับอาร์เรย์
รูปที่ 2.png
อาร์เรย์ที่เรียงลำดับจะแนะนำกลยุทธ์ที่แตกต่าง: กระโดดตรงกลางของอาร์เรย์และดูว่าค่าที่คุณกำลังมองหานั้นน้อยกว่า (ไปทางซ้าย) หรือมากกว่า (ไปทางขวา) ทำซ้ำโดยตัดอาร์เรย์เป็นครึ่งทุกครั้งจนกว่าคุณจะพบค่า
ค้นหาแบบทวิภาค เมื่อรับตัวเลข 10 ตัวมันจะใช้เวลามากถึง 3 ขั้นตอน —- log2 จาก 10 —- เพื่อค้นหาหนึ่งในอาร์เรย์ที่เรียงลำดับ การค้นหา O (บันทึก n) ยอดเยี่ยม หากคุณมีองค์ประกอบ 65,000 รายการคุณจะต้องดำเนินการ 16 ขั้นตอนในการค้นหาหนึ่งรายการ เพิ่มองค์ประกอบเป็นสองเท่าและเป็น 17 ขั้นตอน
แต่อาเรย์เรียงลำดับดูด; สำหรับสิ่งหนึ่งการเรียงลำดับมีราคาแพงกว่าการค้นหาเชิงเส้น ดังนั้นเราจึงไม่ใช้การค้นหาแบบไบนารี่มากนัก เราใช้ต้นไม้คู่แทน
รูปที่ 3.png
ในการค้นหาต้นไม้ไบนารีคุณเริ่มต้นที่ด้านบนและถามตัวเองว่า "เป็นกุญแจสำคัญของฉันน้อยกว่า (ซ้าย) หรือมากกว่า (ขวา) โหนดปัจจุบัน" และทำซ้ำจนกระทั่งตกลงตกลงตกลงคุณรู้เรื่องนี้แล้ว แต่ต้นไม้นั้นสวยใช่มั้ย
ค้นหาด้วยต้นไม้ไบนารี (สมดุล) คือ O (บันทึก n) เช่นการค้นหาแบบไบนารีซึ่งแตกต่างกันไปตามจำนวนขององค์ประกอบในต้นไม้ ต้นไม้ไบนารีน่ากลัว: คุณได้รับการค้นหาอย่างรวดเร็วและข้ามเส้นทางเรียงลำดับสิ่งที่คุณไม่ได้ออกจากตารางแฮช ต้นไม้ไบนารีเป็นการใช้งานตารางเริ่มต้นที่ดีกว่าตารางแฮช 2
แต่ต้นไม้ไบนารีไม่ใช่กลไกการค้นหาแบบโครงสร้างเดียว ฐานรากไบนารีพยายามที่เรียกว่าต้นไม้ PATRICIA ทำงานเหมือนต้นไม้ไบนารีที่มีความแตกต่างพื้นฐานอย่างหนึ่ง แทนที่จะเปรียบเทียบมากกว่า / น้อยกว่าที่แต่ละโหนดคุณตรวจสอบเพื่อดูว่ามีการตั้งค่าบิตหรือไม่แยกทางขวาหากตั้งค่าและตั้งค่าหากไม่มี
รูปที่ 4.png
ฉันทิ้งมากเกี่ยวกับวิธีเลขฐานสองพยายามทำงาน นี่เป็นความอัปยศเพราะความพยายามของเรดิกนั้นน้อยกว่าเอกสารที่ฉาวโฉ่ - เซดเซวิคทำให้เสียชื่อเสียงใน“ อัลกอริธึม” และหน้าวิกิพีเดียสำหรับพวกเขา ผู้คนยังคงโต้เถียงกันเกี่ยวกับสิ่งที่เรียกพวกเขา! แทนคำอธิบายของลิงก์ย้อนกลับและขอบบิตเลเบลตำแหน่งนี่เป็นการนำทับทิมขนาดเล็กมาใช้
นี่คือเหตุผลว่าทำไม Radix พยายามเจ๋ง:
Search performance varies with the key size, not the number of elements in the tree. With 16 bit keys, you’re guaranteed 16 steps
โดยไม่คำนึงถึงจำนวนขององค์ประกอบในต้นไม้โดยไม่สมดุล
More importantly, radix tries give you lexicographic matching, which is a puffed-up way of saying “search with trailing wildcard”, or
“ การค้นหาสไตล์คำสั่งเสร็จสิ้นบรรทัด” ในต้นไม้ radix คุณสามารถค้นหา "ro *" และรับ "โรม" และ "โรแมนติก" และ "โรswell" ได้อย่างรวดเร็ว
3
ฉันหลงทาง
มาพูดถึงบริบทกัน ความพยายามเป็นโครงสร้างข้อมูลที่สำคัญสำหรับการกำหนดเส้นทางอินเทอร์เน็ต ปัญหาการกำหนดเส้นทางเป็นดังนี้:
You have a routing table with entries for “10.0.1.20/32 -> a” and “10.0.0.0/16 -> b”.
You need packets for 10.0.1.20 to go to “a”
You need packets for 10.0.1.21 to to to “b”
นี่เป็นปัญหาที่ยากที่จะแก้ด้วยต้นไม้ไบนารีพื้นฐาน แต่ด้วย radix trie คุณแค่ขอ“ 1010.0000.0000.0000.0000.0000.0001.0100” (สำหรับ 10.0.1.20) และ“ 1010” (สำหรับ 10.0.0.0 ) การค้นหาคำศัพท์ให้คุณ "จับคู่ที่ดีที่สุด" สำหรับการกำหนดเส้นทาง คุณสามารถลองได้ในรหัส Ruby ด้านบน เพิ่ม *” 10.0.0.0” .to_ip ไปยัง Trie และค้นหา“ 10.0.0.1” .to_ip
ความสอดคล้องกันระหว่างการเราต์และการพยายาม Radix นั้นแข็งแกร่งมากจนเป็นที่นิยมมากที่สุดในไลบรารี radix trie (หนึ่งจาก CPAN) ที่ถูกขโมยออกจาก GateD มันยุ่งเหยิงและไม่ใช้มัน
หากคุณเข้าใจว่าคู่ชีวิตทำงานอย่างไรคุณก็เข้าใจว่าการแสดงออกปกตินั้นทำงานอย่างไร ความพยายามเป็นกรณีพิเศษของขอบเขต จำกัด ออโตมาตะ (DFAs) ซึ่งสาขาจะขึ้นอยู่กับการเปรียบเทียบบิตและส่งต่อสาขาเสมอ เอ็นจิ้น regex ที่ดีนั้นกำลังจัดการ DFA ด้วย "คุณสมบัติ" เพิ่มเติม หากรูปภาพของฉันเหมาะสมกับคุณรูปภาพในบทความที่ยอดเยี่ยมเกี่ยวกับอัลกอริทึมการลด NFA-DFA ของ Thompson ก็เช่นกันและบทความนั้นจะทำให้คุณฉลาดขึ้น 4
คุณเป็นผู้ให้บริการเครือข่ายที่ backbone ISP โลกของคุณส่วนใหญ่ประกอบด้วย“ คำนำหน้า” —- คู่เครือข่าย IP / netmask netmasks ในคำนำหน้าเหล่านั้นมีความสำคัญอย่างยิ่งสำหรับคุณ ตัวอย่างเช่น 121/8 เป็นของเกาหลี 121.128 / 10 เป็นของ Korea Telecom, 121.128.10 / 24 เป็นของลูกค้า KT และ 121.128.10.53 เป็นคอมพิวเตอร์หนึ่งเครื่องภายในลูกค้ารายนั้น หากคุณกำลังติดตามบ็อตเน็ตหรือการดำเนินการสแปมหรือการแพร่กระจายเวิร์มหมายเลข netmask นั้นเป็นสิ่งสำคัญสำหรับคุณ
น่าเสียดายที่สำคัญแม้ว่ามันจะอยู่ที่ใดก็ตามบนแพ็กเก็ต IP จะมีการประทับตรา“ netmask” —- netmasks ล้วนเป็นรายละเอียดการกำหนดค่า ดังนั้นเมื่อคุณรับชมข้อมูลคุณต้องให้ข้อมูลนี้เป็นหลัก:
ips.png
น่าแปลกที่ได้รับแพ็คเก็ตมากพอที่จะดูนี่เป็นข้อมูลที่เพียงพอในการคาดเดาเน็ตมาสก์ด้วย ในขณะที่ทำงานที่ Sony Kenjiro Cho ก็คิดวิธีที่จะทำเช่นนั้นโดยดูจากความพยายาม นี่คือวิธี:
ใช้ binary radix trie พื้นฐานเช่นเดียวกับที่เราเตอร์ซอฟต์แวร์ใช้ แต่ จำกัด จำนวนโหนดในต้นไม้ให้พูดถึง 10,000 บนลิงก์แบ็คโบนซึ่งบันทึกที่อยู่จากส่วนหัว IP คุณจะหมด 10,000 โหนดในช่วงเวลาหนึ่ง
เก็บรายการของโหนดในรายการเรียงลำดับตาม LRU กล่าวอีกนัยหนึ่งเมื่อคุณจับคู่ที่อยู่ IP กับโหนดให้“ แตะ” ที่โหนดแล้วติดที่ด้านบนของรายการ ที่อยู่ที่ค่อยๆพบเห็นจะปรากฏเป็นฟองขึ้นไปด้านบนและโหนดที่พบไม่บ่อยจะจมลงสู่ด้านล่าง
รูปที่ 6.png
ตอนนี้เคล็ดลับ เมื่อคุณไม่มีโหนดและต้องการสิ่งใหม่ให้เรียกคืนจากด้านล่างของรายการ แต่เมื่อคุณทำแล้วให้กลิ้งข้อมูลจากโหนดขึ้นไปสู่ parent เช่น:
รูปที่ 5.png
10.0.1.2 และ 10.0.1.3 คือพี่น้อง / 32s, สองครึ่งแบ่งเป็น 10.0.1.2/31 หากต้องการเรียกคืนพวกเขาให้รวมเข้าไว้ใน 10.0.1.2/31 หากคุณต้องการเรียกคืน 10.0.1.2/31 คุณสามารถรวมกับ 10.0.1.0/31 เพื่อสร้าง 10.0.1.0/30
ทำสิ่งนี้พูดนาทีและแหล่งที่ยอดเยี่ยมจะปกป้องตำแหน่งของพวกเขาในต้นไม้โดยอยู่ที่ด้านบนของรายการ LRU ในขณะที่รอบ / 32 เสียงฟองขึ้นไป / 0 สำหรับรายการ raw ของ IP ข้างต้นด้วยทรี 100 โหนดคุณจะได้รับสิ่งนี้
โชเรียกว่า Aguri ฮิวริสติกนี้ 5
Aguri ได้รับอนุญาตจาก BSD คุณสามารถไปดาวน์โหลดได้และโปรแกรมไดรเวอร์ที่คอยดูแพ็คเก็ตผ่าน pcap จากหน้าแรกของ Cho 6
ฉันจะไปที่นี่ แต่ตอนนี้ฉันมี 1,300 คำในโพสต์นี้และถ้าคุณเป็นอัลกอริทึมที่คุณเบื่อฉันในตอนนี้และถ้าคุณไม่คุณก็เบื่อคุณด้วย ตอนนี้ ดังนั้นให้ Aguri จมและฉันจะให้อะไรที่เจ๋งและไร้ประโยชน์กับมันในสัปดาห์นี้
มีลิงค์จำนวนมากกระจายอยู่ในนั้น น่าเสียดายที่ Archive.org ไม่ได้เก็บภาพเพียงข้อความเท่านั้นดังนั้นภาพเหล่านั้นจึงสูญหายไปหลายภาพ นี่คือรายการที่ถูกเก็บถาวร: