คำถามติดแท็ก search-algorithms

อัลกอริทึมสำหรับการค้นหาองค์ประกอบในโครงสร้างข้อมูลที่ระบุ (โดยทั่วไปในโครงสร้างต้นไม้)

8
การค้นหากราฟ: กว้างมากและลึกก่อน
เมื่อค้นหากราฟมีสองขั้นตอนวิธีการง่าย: กว้างแรกและความลึกแรก (มักจะทำโดยการเพิ่มโหนดกราฟ adjactent ทั้งหมดไปยังคิว (กว้างแรก) หรือสแต็ค (ความลึกแรก)) ตอนนี้มีข้อได้เปรียบของอีกคนหนึ่งหรือไม่ สิ่งที่ฉันคิดได้: หากคุณคาดหวังว่าข้อมูลของคุณจะอยู่ด้านล่างของกราฟความลึกอันดับแรกอาจพบได้ก่อนหน้านี้เนื่องจากคุณจะลงไปในส่วนที่ลึกกว่าของกราฟอย่างรวดเร็ว ในทางกลับกันหากคุณคาดหวังว่าข้อมูลของคุณจะค่อนข้างไกลในกราฟความกว้างแรกอาจให้ผลลัพธ์ก่อนหน้านี้ มีอะไรที่ฉันพลาดไปหรือว่ามันเป็นความชอบส่วนตัว?

3
ทำไมการค้นหาแบบไบนารี่จึงเร็วกว่าการค้นหาแบบไตรภาค
การค้นหาอาเรย์ขององค์ประกอบโดยใช้การค้นหาแบบไบนารี่จะใช้เวลาในกรณีที่ซ้ำที่สุดการทำซ้ำเพราะในแต่ละขั้นตอนเราตัดแบ่งครึ่งของพื้นที่การค้นหาของเรา หากเราใช้ 'การค้นหาแบบไตรภาค' แทนเราจะตัดพื้นที่การค้นหาของเราสองในสามในแต่ละการวนซ้ำดังนั้นกรณีที่แย่ที่สุดควรใช้การซ้ำ ...log 2 N log 3 N &lt; log 2 NNNNlog2Nlog2⁡N\log_2 Nlog3N&lt;log2Nlog3⁡N&lt;log2⁡N\log_3 N < \log_2 N ดูเหมือนว่าการค้นหาแบบไตรภาคเร็วกว่าแล้วทำไมเราถึงใช้การค้นหาแบบไบนารี่?

5
การค้นหาแอนนาแกรมที่น่าสนใจ
สมมติว่าและเป็นสองสตริงที่มีความยาวเท่ากัน anagrammingของสองสายคือการทำแผนที่ bijectiveเช่นว่าสำหรับแต่ละฉันb 1 b 2 … b na1a2…ana1a2…ana_1a_2\ldots a_nb1b2…bnb1b2…bnb_1b_2\ldots b_na i = b p ( i ) ip:[1…n]→[1…n]p:[1…n]→[1…n]p:[1\ldots n]\to[1\ldots n]ai=bp(i)ai=bp(i)a_i = b_{p(i)}iii อาจมีแอนนาแกรมมากกว่าหนึ่งรายการสำหรับคู่สายเดียวกัน ตัวอย่างเช่นถ้า `abcab` และเรามีและและอื่น ๆb = p 1 [ 1 , 2 , 3 , 4 , 5 ] → [ 4 , 5 , 1 , …

7
อัลกอริทึมในการค้นหาเส้นผ่านศูนย์กลางของต้นไม้โดยใช้ BFS / DFS ทำไมมันทำงาน
นี้การเชื่อมโยงให้อัลกอริทึมสำหรับการหาขนาดเส้นผ่าศูนย์กลางของต้นไม้ไม่มีทิศทางใช้ BFS สรุป: รัน BFS บนโหนดใด ๆ ในกราฟโดยระลึกถึงโหนดที่ค้นพบล่าสุด รัน BFS จากการที่คุณจดจำโหนด v ที่พบล่าสุด d (u, v) คือเส้นผ่านศูนย์กลางของต้นไม้ ทำไมมันทำงาน หน้า 2 ของสิ่งนี้ให้เหตุผล แต่มันทำให้เกิดความสับสน ฉันกำลังอ้างอิงส่วนเริ่มต้นของการพิสูจน์: รัน BFS บนโหนดใด ๆ ในกราฟโดยระลึกถึงโหนดที่ค้นพบล่าสุด รัน BFS จากการที่คุณจดจำโหนด v ที่พบล่าสุด d (u, v) คือเส้นผ่านศูนย์กลางของต้นไม้ ความถูกต้อง: ให้ a และ b เป็นสองโหนดใด ๆ ที่ d (a, b) คือเส้นผ่านศูนย์กลางของต้นไม้ มีเส้นทางที่ไม่ซ้ำกันจาก …

2
ฉันจะหาภรรยาของฉันในซูเปอร์มาร์เก็ตได้อย่างไร
หากคนสองคนหลงทางในเขาวงกตมีอัลกอริทึมที่พวกเขาทั้งสองสามารถใช้ค้นหาซึ่งกันและกันโดยไม่ได้ตกลงกันก่อนหน้านี้ว่าจะใช้อัลกอริทึมใดหรือไม่ ฉันคิดว่ามีคุณสมบัติบางอย่างที่อัลกอริทึมนี้จะมี: แต่ละคนจะต้องสามารถได้มาโดยใช้ตรรกะที่ไม่มีข้อสมมติฐานเกี่ยวกับสิ่งที่คนอื่นกำลังตัดสินใจ แต่เมื่อแต่ละคนรู้ว่าคนอื่นอยู่ในตำแหน่งเดียวกันพวกเขาอาจทำการหักเงินในสิ่งที่คนอื่นต้องตัดสินใจ อัลกอริทึมที่เหมือนกันจะต้องได้รับจากทั้งสองคนเนื่องจากมีความสมมาตรโดยรวมในสถานการณ์ของพวกเขา (ไม่มีความรู้เกี่ยวกับตำแหน่งเริ่มต้นของอีกฝ่ายและเขาวงกตนั้นมีขนาดคงที่และแมปทั้งคู่) โปรดทราบว่าไม่จำเป็นต้องกำหนดอัลกอริทึม: อนุญาตให้มีการสุ่ม

7
องค์ประกอบหนึ่งที่แตกต่างกันในสองอาร์เรย์ วิธีการค้นหาอย่างมีประสิทธิภาพ?
ฉันกำลังเตรียมการสัมภาษณ์การเขียนโปรแกรมและฉันไม่สามารถหาวิธีที่มีประสิทธิภาพที่สุดในการแก้ปัญหานี้ได้ สมมติว่าเรามีสองอาร์เรย์ประกอบด้วยตัวเลขที่ไม่เรียงกัน Array 2 มีหมายเลขที่ Array 1 ไม่มี ทั้งสองอาร์เรย์มีหมายเลขที่ตั้งแบบสุ่มไม่จำเป็นต้องอยู่ในลำดับเดียวกันหรือในดัชนีเดียวกัน ตัวอย่างเช่น: Array 1 [78,11, 143, 84, 77, 1, 26, 35 .... n] Array 2 [11,84, 35, 25, 77, 78, 26, 143 ... 21 ... n + 1] อัลกอริทึมที่เร็วที่สุดสำหรับการค้นหาหมายเลขที่แตกต่างคืออะไร? เวลาทำงานคืออะไร ในตัวอย่างนี้จำนวนที่เราจะค้นหาคือ 21 ความคิดของฉันคือการทำงานผ่าน Array 1 และลบค่านั้นออกจากอาร์เรย์ 2 ซ้ำแล้วซ้ำอีกจนกว่าคุณจะเสร็จสิ้น นี่ควรจะเป็นเวลาประมาณใช่ไหม?O ( n บันทึกn …

2
เส้นทางที่สั้นที่สุดบนกราฟที่ไม่ได้บอกทิศทาง
ดังนั้นฉันคิดว่าคำถามนี้ (แต่ค่อนข้างพื้นฐาน) อยู่ที่นี่: สมมติว่าฉันมีกราฟขนาด 100 โหนดในรูปแบบ 10x10 (คิดว่ากระดานหมากรุก) กราฟไม่ได้ถูกบอกทิศทางและไม่ได้ถ่วงน้ำหนัก การเคลื่อนที่ผ่านกราฟเกี่ยวข้องกับการเคลื่อนไปข้างหน้าสามช่องทางและข้างหนึ่งไปทางซ้ายหรือขวา (คล้ายกับว่าหมากรุกอัศวินเคลื่อนที่ผ่านกระดาน) เมื่อกำหนดโหนดเริ่มต้นที่แน่นอนแล้วเราจะหาเส้นทางที่สั้นที่สุดไปยังโหนดอื่น ๆ บนกระดานได้อย่างไร ฉันจินตนาการว่าจะมีเพียงขอบระหว่างโหนดที่เคลื่อนที่ได้ ดังนั้นจากข้อมูลนี้ฉันต้องการหาเส้นทางที่สั้นที่สุดจากโหนดเริ่มต้นไปยังโหนดสุดท้าย ความคิดเริ่มต้นของฉันคือขอบแต่ละข้างนั้นมีน้ำหนัก 1 น้ำหนักอย่างไรก็ตามกราฟไม่ได้ถูกบอกทิศทางดังนั้น Djikstras จึงไม่เหมาะอย่างยิ่ง ดังนั้นฉันตัดสินใจที่จะทำโดยใช้รูปแบบที่เปลี่ยนแปลงของการค้นหาความลึกครั้งแรก อย่างไรก็ตามฉันไม่สามารถทำให้ชีวิตของฉันนึกภาพได้ว่าจะหาเส้นทางที่สั้นที่สุดโดยใช้การค้นหาได้อย่างไร อีกสิ่งหนึ่งที่ฉันพยายามคือการใส่กราฟในรูปแบบต้นไม้โดยมีจุดเริ่มต้นเป็นรูทจากนั้นเลือกผลลัพธ์ที่ตื้นที่สุด (หมายเลขแถวต่ำสุด) ที่ให้โหนดปลายทางที่ต้องการแก่ฉัน ... สิ่งนี้ใช้ได้ แต่ก็ไม่มีประสิทธิภาพอย่างเหลือเชื่อ จะไม่ทำงานสำหรับกราฟขนาดใหญ่ ไม่มีใครมีความคิดใด ๆ ที่อาจชี้ให้ฉันไปในทิศทางที่ถูกต้องในเรื่องนี้? ขอบคุณมาก. (ฉันพยายามใส่ภาพกราฟ แต่ไม่สามารถทำได้เนื่องจากชื่อเสียงที่ต่ำของฉัน)

4
วัตถุประสงค์ของโหนดสีเทาในการค้นหากราฟครั้งแรก
ในการนำไปใช้งานหลายครั้งของการค้นหาความลึกครั้งแรกที่ฉันเห็น (ตัวอย่าง: ที่นี่ ) รหัสแยกความแตกต่างระหว่างจุดสุดยอดสีเทา (ค้นพบ แต่ไม่ใช่การเยี่ยมเพื่อนบ้านทั้งหมด) และจุดสุดยอดสีดำ (ค้นพบและเพื่อนบ้านทั้งหมด) . จุดประสงค์ของความแตกต่างนี้คืออะไร? ดูเหมือนว่าอัลกอริทึม DFS จะไม่เข้าเยี่ยมชมจุดสุดยอดไม่ว่าจะเป็นสีเทาหรือสีดำ

4
ค้นหาเวกเตอร์บิตที่ไม่ได้ซ้อนทับกัน
ผมให้คุณรายการnnn bitvectors ของความกว้างของkkkkเป้าหมายของคุณคือส่งคืน bitvector สองตัวจากรายการที่ไม่มี 1s ร่วมกันหรือเพื่อรายงานว่าไม่มีคู่ดังกล่าวอยู่ ตัวอย่างเช่นถ้าผมให้คุณ[00110,01100,11000][00110,01100,11000][00110, 01100, 11000]แล้วทางออกเดียวคือ{00110,11000}{00110,11000}\{00110, 11000\} } อีกวิธีหนึ่งอินพุต[111,011,110,101][111,011,110,101][111, 011, 110, 101]ไม่มีวิธีแก้ปัญหา และรายชื่อใด ๆ ที่มีทุกศูนย์ bitvector 000...0000...0000...0และองค์ประกอบอื่นeeeมีวิธีการแก้ปัญหาที่น่ารำคาญ{e,000...0}{e,000...0}\{e, 000...0\} } นี่เป็นตัวอย่างที่ยากขึ้นเล็กน้อยโดยไม่มีวิธีแก้ปัญหา (แต่ละแถวเป็นบิตเวกเตอร์สี่เหลี่ยมสีดำคือ 1 วินาทีและสี่เหลี่ยมสีขาวเป็น 0s): ■ ■ ■ ■ □ □ □ □ □ □ □ □ □ ■ □ □ □ ■ ■ ■ □ □ …

2
ฮิวริสติกที่ยอมรับได้ช่วยให้มั่นใจได้ว่าเป็นทางออกที่ดีที่สุดได้อย่างไร
เมื่อใช้ A * (หรืออัลกอริทึมการค้นหาเส้นทางที่ดีที่สุดอื่น ๆ ) เราบอกว่าการฮิวริสติกที่ใช้ควรยอมรับได้นั่นคือไม่ควรประเมินค่าความยาวของเส้นทางการแก้ปัญหาที่แท้จริง (หรือย้าย) ฮิวริสติกที่ยอมรับได้ช่วยให้มั่นใจได้ว่าเป็นทางออกที่ดีที่สุดได้อย่างไร ฉันกำลังมองหาคำอธิบายที่ใช้งานง่าย หากคุณต้องการคุณสามารถอธิบายการใช้ฮิวริสติกระยะทางแบบแมนฮัตตันของปริศนา 8 ตัว

2
วิธีการใช้อัลกอริทึม AO *
ฉันสังเกตเห็นว่ามีการใช้โครงสร้างข้อมูลที่แตกต่างกันเมื่อเราใช้อัลกอริทึมการค้นหา ตัวอย่างเช่นเราใช้คิวเพื่อดำเนินการค้นหาอย่างกว้างแรกวางซ้อนเพื่อใช้การค้นหาเชิงลึกครั้งแรกและ min-heaps เพื่อใช้อัลกอริทึม A *อัลกอริทึม ในกรณีเหล่านี้เราไม่จำเป็นต้องสร้างแผนผังการค้นหาอย่างชัดเจน แต่ฉันไม่สามารถหาโครงสร้างข้อมูลที่ง่ายต่อการจำลองขั้นตอนการค้นหาของAO * อัลกอริทึม ฉันอยากรู้ว่าการสร้างแผนผังการค้นหาเป็นวิธีเดียวที่จะใช้อัลกอริทึม AO * หรือไม่ ใครช่วยให้ฉันมีการใช้งานที่มีประสิทธิภาพ?

2
มีการศึกษาหรือทฤษฎีเบื้องหลังการรวมการค้นหาแบบฐานสองและการค้นหาแบบสอดแทรกหรือไม่?
ฉันเพิ่งอ่านอัลกอริทึมนี้ยังสามารถใช้เป็นอัลกอริทึมการค้นหาแบบไบนารี่ได้หรือไม่ และจำได้ว่าไม่กี่ปีหลังฉันเขียนดัชนี / ค้นหาไฟล์บันทึกเพื่อค้นหารายการบันทึกในไฟล์ข้อความธรรมดาขนาดใหญ่ตามหน้าต่างวันที่ / เวลา ในขณะที่ทำสิ่งนี้ฉันตัดสินใจลองค้นหาการแก้ไข (ฉันไม่รู้ว่ามันคือสิ่งที่เรียกว่าฉันเองก็ตกหลุมคิดด้วยตัวเอง) จากนั้นด้วยเหตุผลบางอย่างฉันยังคงความคิดของการสลับขั้นตอนการแก้ไขด้วยขั้นตอนการแยกไบนารี: ในขั้นตอนที่ 0 ฉันจะแก้ไขการตัดสินใจเลือกจุดทดสอบแล้วขั้นตอนที่ 1 ฉันจะใช้จุดกึ่งกลางที่แน่นอน ฯลฯ จากนั้นฉันเปรียบเทียบระบบโดยใช้การค้นหาแบบสอดแทรกที่บริสุทธิ์การค้นหาแบบไบนารีที่แท้จริงและความพยายามในการรวมกันของฉัน วิธีการสลับเป็นผู้ชนะที่ชัดเจนทั้งในเวลาและจำนวนการทดสอบที่จำเป็นก่อนที่จะหาชุดของเวลาที่สุ่มเลือก ได้รับแรงบันดาลใจจากคำถามที่เชื่อมโยงฉันเพิ่งทำการค้นหาอย่างรวดเร็วสำหรับ "การค้นหาการแก้ไขแบบสลับและการค้นหาแบบไบนารี" และไม่พบอะไรเลย ฉันได้ลองใช้ "การค้นหาแบบสอดแทรกการแก้ไขแบบป้องกันความเสี่ยง" ตามที่แนะนำในความคิดเห็นของฉันในคำตอบข้อใดข้อหนึ่ง ฉันเจอสิ่งที่รู้หรือไม่? มีเหตุผลทางทฤษฎีใดที่ทำให้ข้อมูลบางประเภทเร็วขึ้น? โดยทั่วไปไฟล์บันทึกจะมีขนาดใหญ่ในเวลานั้น (เช่นข้อความขนาด 1-2 GB ซึ่งอาจค้นหาได้ 10 ล้านแถว) และการแพร่กระจายของวันที่ / เวลานั้นซับซ้อนด้วยการระเบิดของกิจกรรมเวลาสูงสุดทั่วไปและช่วงเวลาที่เงียบสงบ การทดสอบเกณฑ์มาตรฐานของฉันสุ่มตัวอย่างจากการกระจายเวลาเป้าหมายเท่า ๆ กันเพื่อค้นหา

2
อะไรคืออัลกอริธึมที่ล้ำสมัยสำหรับการค้นหาเส้นทางบนแผนที่ต่อเนื่องของโลก?
สมมติว่าฉันมีเรือสำเภาด้วยตนเองที่ใช้พลังงานแสงอาทิตย์อยู่ที่ไหนสักแห่งในฟยอร์ดของนอร์เวย์ซึ่งมาพร้อมกับแผนที่ชุดล่าสุดตัวรับสัญญาณ GPS และไม่มีคำสั่งรายละเอียดเกี่ยวกับการลิงก์จากฉัน เรือลำนี้ต้องไปถึงให้ได้ถึงเกาะไหหลำในช่วงเวลาที่เร็วที่สุดเท่าที่จะเป็นไปได้ อะไรคืออัลกอริทึมที่กำหนดไว้สำหรับการค้นหาเส้นทางการเดินเรือในโลก? ความซับซ้อนของเวลาและหน่วยความจำคืออะไร ยกตัวอย่างเช่นฉันสามารถใช้ A * หลังจากเปลี่ยนแผนที่ของโลกเป็นแผนภาพที่มีรูปหลายเหลี่ยมที่เชื่อมต่อกัน (เช่น Delaunay triangulation บนทรงกลม / ทรงรี) และอะไรคือวิธีการอื่นที่เป็นไปได้? คำตอบควรให้การอ้างอิงไปยังเอกสารด้วยการอภิปรายคำถามที่กล่าวถึงข้างต้น ตามที่Rob Langชี้ให้เห็นอัลกอริทึมจะต้องตรงกับเกณฑ์ปกติ: ในกรณีที่ไม่มีเวลา จำกัด นำไปสู่เส้นทางที่สั้นที่สุดระหว่างจุดสองจุดใด ๆ บนมหาสมุทรและทะเลของโลกหรือบ่งบอกถึงความล้มเหลวในการหาเส้นทาง มีหัวข้อย่อยที่น่าสนใจที่นี่ (ซื้อขายเวลาคำนวณล่วงหน้า / พื้นที่เก็บข้อมูลสำหรับการคำนวณออนไลน์ให้เส้นทางที่ไม่ดีเล็กน้อยก่อนที่จะถึงกำหนดส่งใน ฯลฯ ) แต่สิ่งเหล่านี้เป็นส่วนเสริมของปัญหาหลัก

3
อัลกอริทึมนี้ยังสามารถใช้เป็นอัลกอริทึมการค้นหาแบบไบนารี่ได้หรือไม่?
ในขณะที่ทำรหัสกะตะที่สอง(ซึ่งขอให้คุณใช้อัลกอริทึมการค้นหาแบบไบนารีห้าครั้งแต่ละครั้งด้วยวิธีการที่แตกต่างกัน) ฉันได้มากับโซลูชันที่แตกต่างกันเล็กน้อยซึ่งทำงานดังนี้: หากฉันมีอาร์เรย์ที่เรียงลำดับความยาว 100 และฉันเห็นว่าเขตข้อมูลเริ่มต้นมีหมายเลข 200 และเขตข้อมูลสิ้นสุดประกอบด้วยหมายเลข 400 ฉันในฐานะคณิตศาสตร์ที่เรียนรู้มนุษย์น่าจะเริ่มค้นหารอบ ๆ เขต 35 ถ้าฉันกำลังค้นหา หมายเลข 270 และไม่ใช่ฟิลด์ 50 เหมือนในอัลกอริธึมการค้นหาไบนารีปกติ จากนั้นถ้าตัวเลขในฟิลด์ 35 ของอาร์เรย์คือ 270, 35 คือดัชนีที่ฉันค้นหา หากไม่ใช่กรณีที่ฉันสามารถเปรียบเทียบจำนวนที่ฉันได้รับ (พูด 280) และทำซ้ำการดำเนินการโดยใช้ส่วนล่างของอาร์เรย์ (ดังนั้นฉันจึงมี 35 ฟิลด์กับเขตข้อมูลเริ่มต้นที่มี 200 และเขตสิ้นสุดที่มี 280) ถ้า จำนวนที่ฉันค้นพบมีค่ามากกว่าสิ่งที่ฉันค้นหาหรือส่วนบนของอาร์เรย์ (บอกว่าฉันได้ 260: ตอนนี้ฉันมีดัชนี 65 ตัว, อันแรกที่มี 260 และอันสุดท้ายที่มี 400 ในแนวตั้งฉันจะมุ่งหน้าแบบ Torward ดัชนี 4 ของอาร์เรย์ย่อยนี้ซึ่งเป็นดัชนี …

2
คำอธิบายแบบเลย์สำหรับการค้นหาแบบสากลคืออะไร
ฉันกำลังอ่านหนังสือในหัวข้อวิทยาศาสตร์คอมพิวเตอร์ แต่ขาดพื้นฐานที่จำเป็นบางประการ โดยปกติเมื่อฉันพบเจอคำศัพท์ที่ฉันไม่เข้าใจฉันแค่ค้นหามัน แต่สำหรับUniversal Searchฉันก็ไม่สามารถหาคำอธิบายที่เหมาะสมสำหรับผู้อ่านที่ไม่มีพื้นฐานด้านสถิติ / วิทยาศาสตร์คอมพิวเตอร์ ฉันได้อ่านบทความนี้เกี่ยวกับการค้นหาทั่วไปจาก Scholarpediaซึ่งดูเหมือนจะครอบคลุมหัวข้อ ฉันขอขอบคุณคำอธิบายความหมายของการค้นหาทั่วไป (หรือการค้นหาเลวิน )

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