Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาไบนารีในโปรแกรม C ++?


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

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

หากชื่อทั้งหมดในโลกถูกเขียนเรียงตามลำดับและคุณต้องการค้นหาตำแหน่งของชื่อใดชื่อหนึ่ง การค้นหาแบบไบนารีจะทำสำเร็จในการทำซ้ำสูงสุด 35 ครั้ง

การค้นหาแบบไบนารีทำงานเฉพาะกับชุดขององค์ประกอบที่เรียงลำดับ หากต้องการใช้การค้นหาแบบไบนารีในคอลเล็กชัน จะต้องจัดเรียงคอลเล็กชันก่อน

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

ให้เราพิจารณาอาร์เรย์ต่อไปนี้ -

ค้นหาไบนารีในโปรแกรม C ++?

โดยใช้การค้นหาเชิงเส้น ตำแหน่งขององค์ประกอบ 8 จะถูกกำหนดในการทำซ้ำครั้งที่ 9

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

Low = 0
High = n-1

ตอนนี้ เปรียบเทียบค่าการค้นหา K กับองค์ประกอบที่อยู่ตรงกลางของขอบเขตล่างและบน หากค่า K มากกว่า ให้เพิ่มขอบเขตล่าง มิฉะนั้นจะลดขอบเขตบน

ค้นหาไบนารีในโปรแกรม C ++?

จากภาพด้านบน ขอบล่างคือ 0 และขอบบนคือ9

ค่ามัธยฐานของขอบเขตล่างและบนคือ (lower_bound + upper_bound) / 2 =4 โดยที่ a[4] =4 ค่า 4>2 ซึ่งเป็นค่าที่คุณกำลังค้นหา ดังนั้น เราไม่จำเป็นต้องทำการค้นหาองค์ประกอบใดๆ ที่เกิน 4 เนื่องจากองค์ประกอบที่เกินจะมากกว่า 2 อย่างเห็นได้ชัด

ดังนั้นเราจึงสามารถวางขอบเขตบนของอาร์เรย์ไปยังตำแหน่งขององค์ประกอบ 4 ได้เสมอ ตอนนี้ เราทำตามขั้นตอนเดียวกันในอาร์เรย์เดียวกันด้วยค่าต่อไปนี้ -

Low: 0
High: 3

ทำซ้ำขั้นตอนนี้ซ้ำๆ จนกระทั่งต่ำ> สูง หากทำซ้ำใด ๆ เราได้รับ a[mid]=key เราจะคืนค่า mid นี่คือตำแหน่งของคีย์ในอาร์เรย์ หากไม่มีคีย์ในอาร์เรย์ เราจะคืนค่า -1

ตัวอย่าง

int binarySearch(int low,int high,int key){
   while(low<=high){
      int mid=(low+high)/2;
      if(a[mid]<key){
         low=mid+1;
      }
      else if(a[mid]>key){
         high=mid-1;
      }
      else{
         return mid;
      }
   }
   return -1; //key not found
}