การทำให้ การค้นหาแบบไบนารี เป็นข้อมูลทั่วไปในมิติที่สูงขึ้น

การค้นหาแบบไบนารี สวัสดีทุกคน ตอนนี้ฉันกำลังพักร้อนอยู่ที่อารูบา ดำน้ำดูปะการัง ออกไปเที่ยวกับครอบครัว และทำงานบางอย่างเกี่ยวกับ kindle scribe ที่ฉันได้รับในวันคริสต์มาส อาลักษณ์เป็นสิ่งทดแทนกระดาษที่ยอดเยี่ยม และฉันก็กำลังขุดมันอยู่ ฉันใช้มันบ่อยในขณะที่ทำงานผ่านสิ่งต่างๆ ในโพสต์นี้ แต่ฉันยังใช้มันกับผู้พัฒนาเกม C++ โดยไม่มีหนังสือกราฟิกที่ฉันกำลังทำอยู่ ฉันจะต้องหาวิธีส่งออกหน้าเพื่อสร้างไดอะแกรมที่ดีขึ้นสำหรับบล็อกโพสต์ในอนาคต (;

อย่างไรก็ตาม ฉันเลิกเล่นทวิตเตอร์แล้วย้ายไปที่มาสโตดอน ฉันอยู่ที่นี่แล้วถ้าคุณอยากติดตามฉัน: https://mastodon.gamedev.place/@demofox

ฉันเพิ่งเล่น battleship กับลูกชายของฉันและคิดว่าการเลือกตำแหน่งที่จะยิงนั้นเหมือนกับการสุ่มตัวอย่างฟังก์ชัน 2d แบบไบนารี่ที่ให้ผลตอบแทน 1 สำหรับการตีหรือ 0 สำหรับการพลาด มีความละเอียดอ่อนมากกว่านี้เนื่องจากมีเรือที่มีความยาวต่างกัน ดังนั้นคุณสามารถรับข้อมูลเพิ่มเติมได้เมื่อเวลาผ่านไป แต่มันทำให้ฉันนึกถึงรูปแบบการยิงในอุดมคติเมื่อค้นหาเรือข้าศึก

ฉันได้ข้อมูลบางอย่างจากมาสโตดอนและพบลิงค์ที่น่าสนใจ

แต่แล้วฉันก็มีความคิดที่แตกต่าง: การค้นหาไบนารีสามารถสรุปจากอาร์เรย์ 1D เป็นอาร์เรย์ 2D หรือสูงกว่าได้หรือไม่ ถ้าเป็นเช่นนั้นพวกเขาจะต้องได้รับการจัดเรียง การจัดเรียงอาร์เรย์ 2 มิติหมายความว่าอย่างไร ไม่น่าแปลกใจเลย ฉันไม่ใช่คนแรกที่คิดเรื่องนี้ และฉันจะเชื่อมโยงไปยังแหล่งข้อมูลบางอย่าง ถึงกระนั้น การเดินทางก็น่าสนใจ และฉันมีโค้ดบางส่วนที่ใช้การค้นหาไบนารีมิติที่สูงกว่า:

โค้ดนี้เขียนขึ้นเพื่อให้อ่านง่าย/เข้าใจได้ ดังนั้นจึงใช้การเรียกซ้ำ ซึ่งในความเป็นจริงแล้วคุณจะไม่ทำเช่นนั้น โดยเฉพาะอย่างยิ่งสำหรับกรณีการค้นหาแบบไบนารี 1 มิติ

การเรียงลำดับ

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

ใช้แนวคิดจาก heps คุณสามารถจัดเรียงบางส่วนเพื่อให้ค่าทางด้านขวาและด้านล่างมากกว่าหรือเท่ากับค่าปัจจุบันในทุกตำแหน่ง และนั่นคือสิ่งที่ฉันจะทำ

ฉันลองพยายามคิดค้นอัลกอริทึมการเรียงลำดับสำหรับสิ่งนี้อยู่พักหนึ่งก่อนที่จะพบว่าคุณสามารถจัดเรียงแถวแกน X ทั้งหมด จากนั้นตามด้วยคอลัมน์แกน Y ทั้งหมด และคุณก็จะได้สิ่งนี้ สำหรับ 3D ขึ้นไป คุณยังคงจัดเรียงแกนใหม่แต่ละแกนต่อไป

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

ลองใช้มุมมองต้นไม้ / กราฟ

ครั้งแรกที่ฉันพยายามมองว่านี่เป็นต้นไม้ที่มีค่ามีลูกสองคน ค่าทางด้านขวาและค่าด้านล่าง เมื่อทำเช่นนี้ ฉันสังเกตเห็นว่าต้นไม้ไม่ใช่ต้นไม้ แต่เป็นกราฟ เนื่องจากค่าเกือบทั้งหมดมีพาเรนต์สองตัว สิ่งที่ดีคือเนื่องจากอาร์เรย์ N-dimensional สามารถจัดเก็บไว้ในหน่วยความจำเป็นอาร์เรย์ 1 มิติ (เนื่องจากนั่นคือวิธีการทำงานของหน่วยความจำ) กราฟนี้สามารถใช้ประโยชน์จากสิ่งนั้นและไม่ต้องการตัวชี้ใด ๆ โดยการเชื่อมโยงระหว่างพ่อแม่และลูกเป็นนัย ( บวก 1 ถึง x เพื่อให้ได้ลูก 1 คน บวก 1 เข้ากับ y เพื่อให้ได้ลูกอีกคน)

ยังไม่แน่ใจว่ามีประโยชน์หรือไม่ แต่จนถึงขณะนี้มีแนวโน้มที่ดี!

ในการค้นหาโครงสร้างนี้ ฉันลองค้นหาเชิงลึกก่อนและพบว่าต้องใช้เวลาอ่านหลายครั้งระหว่างการค้นหา เกือบแย่พอๆ กับการค้นหาเชิงเส้น ส่วนใหญ่เป็นเพราะเด็กมีพ่อแม่หลายคน คุณจะค้นหากราฟย่อยเดียวกันซ้ำซ้อน ฉันวางแผนที่จะเพิ่ม “ดัชนีเวอร์ชันการค้นหา” ในแต่ละค่า เขียนดัชนีนี้เมื่อทดสอบโหนดกราฟ และอ่าน/เรียกซ้ำผ่านโหนดกราฟที่มีหมายเลขเวอร์ชันน้อยกว่าเท่านั้น ซึ่งหมายเลขเวอร์ชันนี้จะเพิ่มขึ้นทุกครั้งที่ทำการค้นหา

ก่อนที่ฉันจะทำตามนั้น ฉันมีความคิดที่ฟังดูดีมากกว่า

กลับไปที่มุมมอง Flat Array

คุณสามารถค้นหาไบนารีในคอลัมน์แรกเพื่อดูว่าค่าใดมีค่ามากกว่าสิ่งที่คุณค้นหาและตัดส่วนใหญ่ของอาร์เรย์ออกหรือไม่ หากคุณสามารถตัดจุดเริ่มต้นออกได้ คุณจะมีขอบเขตขั้นต่ำและสูงสุดในการค้นหา น่าเสียดายที่จำนวนแถวจะผันแปร ซึ่งไม่ดีนักที่จะได้ผลลัพธ์ที่สมบูรณ์แบบอย่างสม่ำเสมอ แต่อย่างน้อยคุณก็สามารถค้นหาแบบไบนารีในแต่ละแถวเพื่อค้นหาค่าของคุณได้ บางทีคุณอาจทำการค้นหาแบบไบนารีข้ามคอลัมน์และสร้างกรอบขอบที่จัดแนวแกนเพื่อค้นหา

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

วิธีที่ดีกว่าในการดูสิ่งต่าง ๆ มาจากการตระหนักว่าองค์ประกอบใด ๆ ในหนึ่งในอาร์เรย์ 2d เหล่านี้ สิ่งใดก็ตามที่มีค่าพิกัด x และ y สูงกว่าหรือเท่ากับจะมากกว่าหรือเท่ากับองค์ประกอบนั้นในค่า นอกจากนี้ อะไรก็ตามที่มีค่าพิกัด x และ y ต่ำกว่าหรือเท่ากันจะน้อยกว่าหรือเท่ากับองค์ประกอบนั้น สิ่งนี้ทำให้สามารถแบ่งสไตล์การค้นหาแบบไบนารีและพิชิตอัลกอริทึมได้

เปรียบเทียบองค์ประกอบตรงกลางของอาร์เรย์ 2 มิติกับค่าการค้นหา หากมีค่าเท่ากัน แสดงว่าการค้นหาของคุณเสร็จสิ้น

หากองค์ประกอบตรงกลางน้อยกว่าค่าการค้นหา คุณทราบดีว่าค่าการค้นหาไม่สามารถอยู่ในควอแดรนท์ที่ดัชนี x และ y เท่ากันหรือน้อยกว่า เนื่องจากค่าทั้งหมดมีค่าเท่ากันหรือน้อยกว่า

ถ้าองค์ประกอบตรงกลางมากกว่าค่าการค้นหา คุณรู้ว่าค่าการค้นหาไม่สามารถอยู่ในควอแดรนท์ที่ดัชนี x และ y เท่ากันหรือมากกว่า เนื่องจากค่าเหล่านี้มีค่าเท่ากันหรือมากกว่า

เมื่อคุณลบควอแดรนท์ออก คุณจะเหลือสี่เหลี่ยมสองอันสำหรับวนซ้ำ

คุณทำขั้นตอนนี้ต่อไปจนกว่าคุณจะพบค่าการค้นหาและส่งคืนค่าจริง หรือพื้นที่ของพื้นที่การค้นหาเป็นศูนย์ หมายความว่าไม่พบค่านั้นและส่งคืนค่าเท็จ

อาร์เรย์ 3 มิติและสูงกว่า

แนวคิดเหล่านี้สรุปเป็น 3 มิติโดยที่คุณทำการเรียงลำดับสามแกนของอาร์เรย์ 3 มิติเพื่อเริ่มต้น

เช่นเดียวกับกรณีอาร์เรย์ 2 มิติ จากนั้นคุณทดสอบองค์ประกอบตรงกลางกับคีย์ค้นหาและทำเสร็จแล้ว ลบออกเทนต์ค่าต่ำที่สัมผัส (0,0,0) หรือลบออกเทนต์ค่าสูงที่สัมผัส (ความกว้าง ความสูง , ความลึก).

ในกรณี 2 มิติ การลบควอแดรนท์ทำให้เรามีสี่เหลี่ยมสองรูปเพื่อเรียกซ้ำ ในกรณี 3 มิติ การถอดแปดเหลี่ยมออกทำให้เรามีคิวบอยด์สามลูกเพื่อเรียกซ้ำ การค้นหาแบบไบนารี

สิ่งนี้ทำให้ภาพรวมเป็น 4D ขึ้นไปได้ดี โดยทำตามรูปแบบของมิติที่ต่ำกว่า

คุณสมบัติด้านประสิทธิภาพ

ใน 1D อัลกอริทึมนี้เป็นการค้นหาแบบไบนารีที่คุณทิ้งครึ่งซ้ายหรือขวาของอาร์เรย์หลังจากเปรียบเทียบองค์ประกอบตรงกลางกับคีย์ค้นหา แต่ละขั้นตอนจะลบ 1/2 ของค่าออกจากการพิจารณา

ในแบบ 2 มิติ อัลกอริทึมนี้จะโยนควอแดรนท์ที่มีค่าต่ำกว่าหรือควอแดรนท์ที่มีค่าสูงกว่าออกไปในแต่ละขั้นตอน แต่ละขั้นตอนจะลบ 1/4 ของค่าออกจากการพิจารณา

3D พ่นค่าแปดหรือ 1/8 ของค่าจากการพิจารณาในแต่ละขั้นตอน

เรากำลังเผชิญกับคำสาปแห่งมิติและได้รับผลตอบแทนที่ลดลง ทิ้ง 1 / (2^D) ในแต่ละขั้นตอนสำหรับการค้นหาไบนารีมิติ

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

มีวิธีใดที่จะช่วยได้บ้าง? เราสามารถจัดเรียงอาร์เรย์เพื่อเพิ่มค่าในแต่ละขั้นตอนได้หรือไม่ ไม่แน่ใจ.

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *