เปรียบเทียบระหว่างอัลกอริทึม Aho-Corasick และอัลกอริทึม Rabin-Karp


11

ฉันกำลังทำงานกับอัลกอริธึมการค้นหาสตริงที่สนับสนุนการค้นหาหลายรูปแบบ ผมพบว่าทั้งสองขั้นตอนวิธีการที่ดูเหมือนผู้สมัครที่แข็งแกร่งที่สุดในแง่ของเวลาการทำงานคือAho-Corasickและราบิน-คาร์พ อย่างไรก็ตามฉันไม่พบการเปรียบเทียบแบบครอบคลุมระหว่างอัลกอริธึมทั้งสอง อัลกอริทึมใดที่มีประสิทธิภาพมากกว่า นอกจากนี้อันไหนที่เหมาะกว่าสำหรับการคำนวณแบบขนานและการค้นหาหลายรูปแบบ? ในที่สุดใครจะใช้ทรัพยากรฮาร์ดแวร์น้อย?

สำหรับอัลกอริทึม AC ระยะการค้นหาใช้เวลาในขณะที่เป็น RK อย่างไรก็ตามเวลาทำงานสำหรับ RK คือซึ่งทำให้คล้ายกับ AC ข้อสรุปเบื้องต้นของฉันคือ RK ดูดีกว่าเพราะไม่ต้องการหน่วยความจำมากเท่ากับ AC ถูกต้องหรือไม่O(n+m)O(nm)O(n+m)


รูปแบบทั้งหมดของคุณมีความยาวเท่ากันหรือไม่?
Hendrik Jan

@HendrikJan ไม่รูปแบบความยาวแตกต่างกัน
Hawk

หากรูปแบบมีความยาวแตกต่างกันดูเหมือนว่ายากที่จะประมวลผลแบบขนานโดยใช้ RK? หน้าวิกิพีเดียดูเหมือนว่าจะแนะนำรูปแบบเหล่านี้ที่มีความยาวเท่ากันแม้ว่าการปรับปรุงแฮชสามารถทำได้สำหรับความยาวที่แตกต่างกัน
Hendrik Jan

คุณสนใจศึกษาทฤษฎีหรือประสบการณ์เชิงปฏิบัติบางประเภทหรือไม่?
กราฟิลส์

@ ราฟาเอลเชิงวิชาการเราเคยใช้การศึกษาเชิงทฤษฎีก่อนที่เราจะพิสูจน์ได้ว่าประจักษ์ ฉันโพสต์คำถามที่นี่เพราะฉันไม่ได้คาดหวังคำตอบการเขียนโปรแกรม ฉันต้องการคำตอบอัลกอริทึมแบบลอจิคัล
Hawk

คำตอบ:


4

การวิเคราะห์เวลาทำงานแบบอะซิมโทติกไม่น่าจะเป็นเครื่องมือที่ดีที่สุดในการเลือกระหว่างอัลกอริธึมทั้งสอง: การวิเคราะห์แบบอะซิมโทติคจะไม่สนใจปัจจัยคงที่และปัจจัยคงที่จะมีความสำคัญที่นี่ อัลกอริธึมทั้งสองนั้นมีเวลาทำงานแบบ asymptotic เหมือนกันดังนั้นการวิเคราะห์แบบ asymptotic อาจไม่เป็นประโยชน์ในการเลือกระหว่างมัน

วิธีที่ถูกต้องระหว่างอัลกอริธึมทั้งสองคือการวิเคราะห์เชิงทดลอง ระบุเวิร์กโหลดของตัวแทนและเปรียบเทียบประสิทธิภาพของอัลกอริธึมทั้งสองกับเวิร์กโหลดของคุณกับชนิดของเครื่องที่คุณตั้งใจจะใช้ในทางปฏิบัติ


ดูเหมือนว่าคุณอาจมีความสับสนเล็กน้อยเกี่ยวกับเวลาที่ใช้ในการทำงานของ Rabin-Karp ในอีกด้านหนึ่งคุณบอกว่า Rabin-Karp มีเวลาทำงานแต่ในประโยคถัดไปคุณจะพูดว่า Rabin-Karp มีเวลาทำงานบางทีคุณอาจสับสนกับความแตกต่างระหว่างเวลาเฉลี่ยกับกรณีที่แย่ที่สุดO(nm)O(n+m)

เนื่องจาก Rabin-Karp ได้รับการสุ่มเวลาในการทำงานที่คาดหวัง (โดยเฉลี่ย) เป็นตัวชี้วัดที่เหมาะสมที่จะใช้ในการทำนายประสิทธิภาพการทำงานจริงของโลกในทางปฏิบัติ โดยเฉพาะอย่างยิ่งที่นี่ค่าเฉลี่ยจะถูกนำไปเลือกสุ่มของฟังก์ชั่นแฮ ไม่ใช่เฉพาะค่าเฉลี่ยที่เลือกมาจากสตริง แม้สำหรับสตริงที่เลวร้ายที่สุดและรูปแบบเวลาทำงานเฉลี่ยจะยังคงเป็นm) ด้วยฟังก์ชั่นแฮชที่เหมาะสมน่าจะเป็นที่เวลาทำงานเป็นเวลานานกว่าชี้แจงเล็ก ๆ ในคหากต้องการใช้วิธีอื่น (และไม่เป็นทางการเล็กน้อย) มีโอกาสน้อยมากที่ Rabin-Karp ใช้เวลานานกว่าO(n+m)c(n+m)cO(n+m)เวลา. เราต้องยอมรับโอกาสเล็ก ๆ น้อย ๆ อย่างทวีคูณของสิ่งเลวร้ายที่เกิดขึ้น - เช่นมีโอกาสเล็ก ๆ แต่ไม่เป็นศูนย์ของรังสีคอสมิกทำให้เกิดการพลิกบิตในหน่วยความจำของคุณที่ทำให้โปรแกรมวนซ้ำตลอดไป ดังนั้นการกังวลเกี่ยวกับโอกาสเล็ก ๆ น้อย ๆ นี้จึงไม่สมเหตุสมผล

จากมุมมองทางวิศวกรรมเวลาทำงานของ Rabin-Karp คือ [หรืออาจจะ] ไม่สนใจสิ่งที่ ; มันไม่เกี่ยวข้องกับการฝึกฝนจริงๆO(n+m)O(nm)


1

อย่างไรก็ตามฉันไม่พบการเปรียบเทียบแบบครอบคลุมระหว่างอัลกอริธึมทั้งสอง

คำถามเช่นนี้เกี่ยวกับประสิทธิภาพสัมพัทธ์ของอัลกอริทึมสองโดยทั่วไปจะขึ้นอยู่กับกรณีทั่วไปและกรณีที่เลวร้ายที่สุดซึ่งขึ้นอยู่กับข้อมูลจริง คำตอบเชิงทฤษฎีคือว่าอัลกอริธึ Aho-Corasickจะมีประสิทธิภาพสูงกว่า Rabin-Karp ในกรณีขีด จำกัด ข้อมูลขนาดใหญ่ / asymptotically แต่เมื่อถึงขีด จำกัด นั้นการใช้งานและขึ้นอยู่กับข้อมูล & การแลกเปลี่ยนระหว่างการค้นหา / เวลาทำงานO(n+m)O(nm)

แต่ wrt การสืบค้นโดยนัยของคุณสำหรับ "การเปรียบเทียบแบบครอบคลุม" เอกสารบางชิ้นได้ถูกเขียนขึ้นโดยการทดลอง / สังเกตุเปรียบเทียบทั้งสองและอัลกอริทึมอื่น ๆ กับข้อมูลจริงและรวมถึงการวิเคราะห์ / เปรียบเทียบข้อดี / ข้อเสีย / การแลกเปลี่ยนของขั้นตอนวิธีต่างๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.