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

ค้นหาดัชนีของ 1 ตัวแรกในอาร์เรย์ที่เรียงลำดับอนันต์ของ 0 และ 1 ใน C ++


ในปัญหานี้ เราได้รับ infinite array bin[] ซึ่งประกอบด้วยค่าบูลีน (เฉพาะ 0 และ 1) ในการเรียงลำดับ งานของเราคือ ค้นหาดัชนีของ 1 ตัวแรกในอาร์เรย์ที่เรียงลำดับแบบอนันต์ของ 0 และ 1 .

ที่นี่ เรามีอาร์เรย์อนันต์ซึ่งรับประกันว่ามี 1 อยู่ในอาร์เรย์

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

Input : bin[] = {0, 0, 0, 1, 1, ....}
Output : 3

คำอธิบาย

First 1 of the binary array is encountered at index 3.

แนวทางการแก้ปัญหา

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

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

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <iostream>
using namespace std;
double find1stOneInfiniteArray(int bin[]) {
   int i = 0;
   while(1){
      if (bin[i] == 1)
         return i;
      i++;
   }
   return -1;
}
int main() {
   int bin[] = { 0, 0, 0, 1, 1, 1 };
   cout<<"The index of 1st occurrence of 1 in infinite array is "<<find1stOneInfiniteArray(bin);
   return 0;
}

ผลลัพธ์

The index of 1st occurrence of 1 in infinite array is 3

เทคนิคการค้นหาอื่น ที่สามารถใช้ได้คือการค้นหาแบบไบนารีเมื่อจัดเรียงอาร์เรย์

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

เมื่อใช้ขอบเขตเหล่านี้ เราสามารถค้นหาดัชนีโดยใช้การค้นหาแบบไบนารี

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <iostream>
using namespace std;
double find1stOneInfiniteArray(int bin[], int low, int high) {
   int mid;
   while (low <= high) {
      mid = (low + high) / 2;
      if (bin[mid] == 1 && (mid == 0 || bin[mid - 1] == 0))
         return mid;
      else if (bin[mid] == 1)
         high = mid - 1;
      else
         low = mid + 1;
   }
   return -1;
}
int main() {
   int bin[] = { 0, 0, 0, 1, 1, 1, 1 };
   int low = 0;
   int high = 1;
   while(bin[high] != 1){
      low = high;
      high *= 2;
   }
   cout<<"The index of 1st occurrence of 1 in infinite array is " <<find1stOneInfiniteArray(bin,low, high);
   return 0;
}

ผลลัพธ์

The index of 1st occurrence of 1 in infinite array is 3