คำถามติดแท็ก string-metrics

2
โครงสร้างข้อมูลที่มีประสิทธิภาพสำหรับการสร้างเครื่องมือตรวจสอบการสะกดคำอย่างรวดเร็ว
ฉันกำลังพยายามเขียนตัวตรวจการสะกดซึ่งควรใช้กับพจนานุกรมที่มีขนาดค่อนข้างใหญ่ ฉันต้องการวิธีที่มีประสิทธิภาพในการจัดทำดัชนีข้อมูลพจนานุกรมของฉันโดยใช้ระยะทางDamerau-Levenshteinเพื่อกำหนดว่าคำใดที่ใกล้เคียงที่สุดกับคำที่สะกดผิด ฉันกำลังมองหาโครงสร้างข้อมูลที่จะให้ความประนีประนอมระหว่างความซับซ้อนของพื้นที่กับความซับซ้อนของรันไทม์ได้ดีที่สุด จากสิ่งที่ฉันพบบนอินเทอร์เน็ตฉันมีโอกาสในการขายไม่กี่เกี่ยวกับประเภทของโครงสร้างข้อมูลที่จะใช้: Trie นี่เป็นความคิดแรกของฉันและดูใช้งานได้ง่ายและควรมีการค้นหา / แทรกอย่างรวดเร็ว การค้นหาโดยประมาณโดยใช้ Damerau-Levenshtein ควรง่ายต่อการใช้งานที่นี่เช่นกัน แต่มันไม่ได้ดูมีประสิทธิภาพมากนักในแง่ของความซับซ้อนของพื้นที่เนื่องจากคุณมักจะมีค่าใช้จ่ายจำนวนมากกับที่เก็บข้อมูลพอยน์เตอร์ Patricia Trie ดูเหมือนว่าจะใช้เนื้อที่น้อยกว่า Trie ปกติเนื่องจากคุณไม่ต้องเสียค่าใช้จ่ายในการเก็บพอยน์เตอร์ แต่ฉันกังวลเกี่ยวกับการแยกส่วนข้อมูลในกรณีที่พจนานุกรมมีขนาดใหญ่มากเหมือนที่ฉันมี ต้นไม้ต่อท้าย ฉันไม่แน่ใจเกี่ยวกับสิ่งนี้ดูเหมือนว่าบางคนจะพบว่ามีประโยชน์ในการทำเหมืองข้อความ แต่ฉันไม่แน่ใจว่าสิ่งที่จะให้ในแง่ของประสิทธิภาพสำหรับตัวตรวจสอบการสะกด Ternary Search Tree สิ่งเหล่านี้ดูดีมากและในแง่ของความซับซ้อนควรอยู่ใกล้ (ดีกว่า) กับ Patricia Tries แต่ฉันไม่แน่ใจเกี่ยวกับการแยกส่วนหากมันจะดีกว่าแย่กว่า Patricia Tries ต้นไม้ระเบิด ดูเหมือนว่าจะเป็นลูกผสมและฉันก็ไม่แน่ใจว่าจะได้ประโยชน์อะไรจาก Tries และสิ่งที่คล้ายกัน แต่ฉันได้อ่านมาหลายครั้งแล้วว่ามันมีประสิทธิภาพมากสำหรับการทำเหมืองข้อความ ฉันต้องการรับความคิดเห็นเกี่ยวกับโครงสร้างข้อมูลที่ดีที่สุดที่จะใช้ในบริบทนี้และสิ่งที่ทำให้ดีกว่าที่อื่น หากฉันขาดโครงสร้างข้อมูลบางอย่างที่เหมาะสมกว่าสำหรับเครื่องตรวจการสะกดคำฉันก็สนใจเช่นกัน

2
เหตุใด C ประเภทโมฆะจึงไม่คล้ายกับประเภทที่ว่าง / ด้านล่าง
Wikipedia ตลอดจนแหล่งข้อมูลอื่น ๆ ที่ฉันได้พบรายการvoidประเภทC เป็นหน่วยประเภทซึ่งตรงข้ามกับประเภทที่ว่างเปล่า ฉันพบว่ามันสับสนเพราะฉันคิดว่าvoidเหมาะกับนิยามของประเภทที่ว่าง / ล่าง ไม่มีค่านิยมใด ๆ อยู่voidเท่าที่ฉันจะบอกได้ ฟังก์ชั่นที่มีประเภทคืนค่าเป็นโมฆะระบุว่าฟังก์ชั่นจะไม่ส่งคืนสิ่งใดดังนั้นจึงสามารถทำงานได้เพียงผลข้างเคียงเท่านั้น ตัวชี้ชนิดvoid*เป็นชนิดย่อยของชนิดตัวชี้อื่นทั้งหมด นอกจากนี้การแปลงไปยังและจากvoid*ใน C นั้นเป็นนัย ผมไม่แน่ใจว่าถ้าจุดสุดท้ายมีบุญใด ๆ ที่เป็นข้อโต้แย้งสำหรับvoidการเป็นประเภทที่ว่างเปล่าเป็นมากหรือน้อยเป็นกรณีพิเศษที่มีความสัมพันธ์ไม่มากที่จะvoid*void ในทางกลับกันvoidตัวมันเองไม่ใช่ประเภทย่อยของประเภทอื่นทั้งหมดซึ่งเท่าที่ฉันสามารถบอกได้ว่าเป็นข้อกำหนดสำหรับประเภทที่จะเป็นประเภทด้านล่าง
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

1
แก้ไขระยะทางของรายการด้วยองค์ประกอบเฉพาะ
Levenshtein-Distance ระยะทางแก้ไขระหว่างรายการเป็นปัญหาที่ศึกษากันดี แต่ฉันไม่สามารถหามากเกี่ยวกับการปรับปรุงไปได้ถ้า มันเป็นที่รู้จักกันว่าองค์ประกอบไม่มีไม่เกิดขึ้นมากกว่าหนึ่งครั้งในแต่ละรายการ ลองสมมติว่าองค์ประกอบนั้นสามารถเปรียบเทียบได้ / เรียงลำดับได้ (แต่รายการที่จะเปรียบเทียบจะไม่เรียงลำดับเพื่อเริ่มต้นด้วย) O(min(m,n)s)O(min(m,n)s)O(\min(m,n)s)O(min(s,m,n)s)O(min(s,m,n)s)O(\min(s,m,n)s)sss เป็นทางการมากขึ้น เราสามารถคำนวณระยะทางในการแก้ไขระหว่างสองสายที่กำหนด มีประสิทธิภาพด้วยคำสัญญาที่ว่าพวกเขาไม่มีตัวอักษรซ้ำ ๆ กันหรือไม่?s,t∈Σ∗s,t∈Σ∗s,t \in \Sigma^* ΣΣ\Sigmaเป็นตัวอักษรที่มีขนาดใหญ่มาก

1
Earley Parser สามารถสร้างเป็น parser fuzzy คล้ายกับ Levenshtein Automata Algo สำหรับ DFA ได้หรือไม่?
มีวิธีการแยกวิเคราะห์แบบคลุมเครือ (ยอมรับสตริงแม้มีความผิดพลาดในการแก้ไขระยะทางที่แน่นอน) ด้วย DFA และ Levenshtein Automata ที่สร้างขึ้นในเวลาทำงานของคำที่ป้อนเข้า สิ่งที่คล้ายกันสามารถทำได้ด้วยการแยกวิเคราะห์ Earley? ฉันพบว่ามันยากที่จะเข้าใจอัลกอริทึมให้ตอบคำถามนี้โดยลำพัง

2
อัลกอริทึมการจับคู่สตริง k ไม่ตรงกันอย่างรวดเร็ว
ฉันกำลังมองหาอัลกอริทึมการจับคู่สตริง k-mismatch ที่รวดเร็ว กำหนดสตริงรูปแบบ P ของความยาว m และสตริงข้อความ T ของความยาว n, ฉันต้องการอัลกอริทึม (เชิงเส้นเวลา) ที่รวดเร็วเพื่อค้นหาตำแหน่งทั้งหมดที่ P ตรงกับสตริงย่อยของ T กับ k ไม่ตรงกันมากที่สุด สิ่งนี้แตกต่างจากปัญหาความแตกต่างของ k (ระยะทางแก้ไข) ไม่ตรงกันหมายถึงสตริงย่อยและรูปแบบมีตัวอักษรที่แตกต่างกันในตำแหน่ง k มากที่สุด ฉันต้องการเพียง k = 1 (มากที่สุด 1 ไม่ตรงกัน) ดังนั้นอัลกอริทึมที่รวดเร็วสำหรับกรณีเฉพาะของ k = 1 ก็จะเพียงพอเช่นกัน ขนาดตัวอักษรคือ 26 (ตัวพิมพ์เล็กและตัวพิมพ์เล็ก) ดังนั้นความต้องการพื้นที่ไม่ควรเติบโตเร็วเกินไปเมื่อเทียบกับขนาดของตัวอักษร (เช่นอัลกอริทึม FAAST ฉันเชื่อว่าใช้พื้นที่ชี้แจงแทนขนาดตัวอักษรและอื่น ๆ เหมาะสำหรับลำดับโปรตีนและยีนเท่านั้น) วิธีการเขียนโปรแกรมแบบไดนามิกที่ใช้มีแนวโน้มที่จะเป็น O (mn) …

1
Micro-optimization สำหรับการคำนวณระยะทางแก้ไข: ถูกต้องหรือไม่
บนWikipedia จะมีการติดตั้งชุดรูปแบบการเขียนโปรแกรมแบบไดนามิกจากล่างขึ้นบนสำหรับระยะแก้ไข ไม่ปฏิบัติตามคำจำกัดความอย่างสมบูรณ์ เซลล์ภายในจะถูกคำนวณดังนี้: if s[i] = t[j] then d[i, j] := d[i-1, j-1] // no operation required else d[i, j] := minimum ( d[i-1, j] + 1, // a deletion d[i, j-1] + 1, // an insertion d[i-1, j-1] + 1 // a substitution ) } อย่างที่คุณเห็นอัลกอริทึมจะเลือกค่าจากเพื่อนบ้านบนซ้ายถ้ามีการจับคู่การบันทึกการเข้าถึงหน่วยความจำการดำเนินการ ALU และการเปรียบเทียบ …

1
การกำหนดความคล้ายคลึงกันของสตริงที่กำหนดให้กับชุดของสตริง
ฉันไม่แน่ใจว่าคำถามนี้เป็นของที่นี่และฉันขอโทษถ้าไม่ได้ สิ่งที่ฉันต้องการทำคือการพัฒนาวิธีการเขียนโปรแกรมที่ฉันสามารถตรวจสอบความน่าจะเป็นว่าสตริงที่กำหนด "เป็น" ในถุงของสตริง ตัวอย่างเช่นถ้าฉันมีชื่อเมือง 10,000 ชื่อในอเมริกาและมีสตริง "ฟิลาเดลเฟีย" ฉันต้องการวัดเชิงปริมาณของโอกาสที่ 'ฟิลาเดลเฟีย' เป็นชื่อเมืองในสหรัฐอเมริกาตามชื่อเมืองที่ฉันรู้จัก ในขณะที่ฉันรู้ว่าฉันจะไม่สามารถแยกชื่อเมืองจริงออกจากชื่อเมืองปลอมในบริบทนี้อย่างน้อยฉันก็คาดหวังว่าจะมีสตริงเช่น "123.75" และ "สุนัขจิ้งจอกสีแดงอย่างรวดเร็วกระโดดข้ามสุนัขสีน้ำตาลขี้เกียจ" ยกเว้น เกณฑ์บางอย่าง ในการเริ่มต้นฉันดูที่ Levenshtein Distance และแหย่เล็กน้อยเกี่ยวกับวิธีการนำไปใช้กับปัญหาอย่างน้อยค่อนข้างคล้ายกับที่ฉันพยายามแก้ไข แอปพลิเคชั่นที่น่าสนใจอย่างหนึ่งที่ฉันค้นพบคือการตรวจจับการลอกเลียนแบบโดยมีกระดาษหนึ่งเล่มอธิบายว่าระยะทางของ Levenshtein ถูกนำไปใช้กับอัลกอริทึม Smith-Waterman ที่แก้ไขเพื่อทำคะแนนเอกสารได้อย่างไร คำถามของฉันคือถ้าใครสามารถชี้ให้ฉันไปในทิศทางที่ถูกต้องกับอัลกอริทึมหรือวิธีการอื่นที่อาจช่วยฉันได้ ฉันรู้สึกว่านี่อาจเป็นปัญหาที่บางคนในอดีตพยายามแก้ไข แต่จนถึงตอนนี้ Google-fu ของฉันก็ล้มเหลวฉัน

1
แสดงการเปลี่ยนแปลงโดยพลการเป็นลำดับของการดำเนินการ (แทรกย้ายลบ)
สมมติว่าฉันมีสองสาย โทรหาพวกเขาAAA และ BBB. ไม่มีสตริงที่มีอักขระซ้ำ ๆ กัน ฉันจะค้นหาลำดับการแทรกย้ายและลบที่สั้นที่สุดที่เปลี่ยนไปได้อย่างไร AAA เข้าไป BBBที่ไหน: insert(char, offset)แทรกcharที่กำหนดoffsetในสตริง move(from_offset, to_offset)ย้ายอักขระปัจจุบันที่ออฟเซ็ตfrom_offsetไปยังตำแหน่งใหม่เพื่อให้ออฟเซ็ตto_offset delete(offset) ลบอักขระที่ offset แอปพลิเคชันตัวอย่าง: คุณทำการสืบค้นฐานข้อมูลและแสดงผลลัพธ์บนเว็บไซต์ของคุณ ในภายหลังคุณรันการสืบค้นฐานข้อมูลอีกครั้งและค้นพบว่าผลลัพธ์มีการเปลี่ยนแปลง คุณต้องการเปลี่ยนสิ่งที่อยู่บนหน้าเพื่อให้ตรงกับสิ่งที่อยู่ในฐานข้อมูลโดยใช้การดำเนินการ DOM ขั้นต่ำ มีสองเหตุผลที่คุณต้องการให้ลำดับการทำงานสั้นที่สุด ครั้งแรกที่มีประสิทธิภาพ เมื่อมีการเปลี่ยนแปลงระเบียนเพียงไม่กี่คุณต้องการให้แน่ใจว่าคุณทำO (1)O(1)\mathcal{O}(1) ค่อนข้างมากกว่า O (n)O(n)\mathcal{O}(n)การทำงานของ DOM เนื่องจากมีราคาแพง ประการที่สองความถูกต้อง หากรายการถูกย้ายจากตำแหน่งหนึ่งไปอีกตำแหน่งหนึ่งคุณต้องการย้ายโหนด DOM ที่เกี่ยวข้องในการดำเนินการครั้งเดียวโดยไม่ต้องทำลายและสร้างใหม่อีกครั้ง มิฉะนั้นคุณจะสูญเสียสถานะโฟกัสเนื้อหาของ<input>องค์ประกอบและอื่น ๆ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.