یافتن یک عنصر در یک آرایه بی نهایت با استفاده از جاوا

Summarize this content to 400 words in Persian Lang
بیان مشکل
با توجه به یک آرایه نامتناهی از اعداد صحیح مرتب شده، باید شاخص یک عدد هدف معین را پیدا کنیم. آرایه “بی نهایت” است، به این معنی که نمی توانیم اندازه آن را از قبل تعیین کنیم، بنابراین نمی توانیم فقط یک جستجوی باینری سنتی را مستقیماً اعمال کنیم.
بررسی اجمالی رویکرد
با یک محدوده کوچک شروع کنید: در ابتدا، فرض کنید که عنصر در محدوده کوچکی قرار دارد (مثلاً بین شاخص های 0 و 1).
به صورت پویا دامنه را افزایش دهید: اگر عنصر هدف در محدوده اولیه یافت نشد، برای جستجوی بیشتر، اندازه محدوده را دو برابر می کنیم. این رشد تصاعدی به ما امکان میدهد تا به سرعت در محدودهای که ممکن است هدف قرار گرفته باشد، حرکت کنیم.
جستجوی باینری در محدوده: هنگامی که محدوده مناسبی را که حاوی هدف است تعیین می کنیم، جستجوی باینری را برای یافتن موثر شاخص هدف اعمال می کنیم.
کد
public class InfiniteArraySearch {
public static void main(String[] args) {
// Define the array (for demonstration purposes, treat this as infinite)
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int target = 6;
// Call the function to find the target element
int result = findElementInInfiniteArray(arr, target);
System.out.println(“Element found at index: ” + result);
}
// Function to find the target in the infinite array
static int findElementInInfiniteArray(int[] arr, int target) {
// Start with a small range
int start = 0;
int end = 1;
// Dynamically increase the range until the target is within bounds
while (target > arr[end]) {
int newStart = end + 1; // Update start to one after the current end
end = end + (end – start + 1) * 2; // Double the range
start = newStart; // Move the start to newStart
}
// Perform binary search within the determined range
return binarySearch(arr, target, start, end);
}
// Standard binary search implementation
static int binarySearch(int[] arr, int target, int start, int end) {
while (start end) {
int mid = start + (end – start) / 2;
if (target arr[mid]) {
end = mid – 1; // Move the end to the left
} else if (target > arr[mid]) {
start = mid + 1; // Move the start to the right
} else {
return mid; // Element found
}
}
return -1; // Element not found
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
توضیح آیین نامه
1. عملکرد اصلی
تابع main یک آرایه نمونه را تعریف می کند arr و یک مقدار هدف 6. برای سادگی، ما آرایه را در اینجا محدود فرض میکنیم، اما از نظر مفهومی، آن را بینهایت در نظر میگیریم. سپس تابع اصلی فراخوانی می کند findElementInInfiniteArray برای جستجوی هدف، و در صورت یافتن فهرست را چاپ می کند.
2. گسترش دامنه (گسترش خطی منطقه جستجو)
در findElementInInfiniteArray روش:
ما با فرض اینکه عنصر در محدوده قرار دارد شروع می کنیم [0, 1].
اگر هدف بزرگتر از مقدار در است arr[end]، به این معنی است که هدف در محدوده فعلی نیست. بنابراین، ما محدوده را به صورت تصاعدی با دو برابر کردن آن گسترش می دهیم (end = end + (end – start + 1) * 2). این به طور موثر به ما اجازه می دهد تا در هر تکرار زمینه بیشتری را پوشش دهیم.
3. جستجوی باینری
زمانی که بدانیم هدف باید بین آن قرار گیرد start و end، ما یک جستجوی باینری استاندارد انجام می دهیم. جستجوی باینری روشی کارآمد برای جستجو در آرایه های مرتب شده است، زیرا در هر مرحله فضای جستجو را به نصف کاهش می دهد. مقایسه های کلیدی عبارتند از:
اگر هدف کمتر از عنصر میانی باشد (arr[mid]، نیمه چپ را جستجو کنید.
اگر هدف بزرگتر است، نیمه سمت راست را جستجو کنید.
اگر هدف با عنصر میانی مطابقت دارد، شاخص آن را برگردانید.
4. موارد لبه
اگر هدف کوچکتر از کوچکترین عنصر آرایه باشد، یا اگر آرایه اصلاً هدف را نداشته باشد، الگوریتم باز خواهد گشت. -1.
پیچیدگی زمانی
گسترش دامنه: محدوده با هر تکرار دو برابر می شود، بنابراین طول می کشد O(log N) عملیات برای یافتن محدوده مناسب جایی که هدف قرار دارد.
جستجوی باینری: هنگامی که محدوده پیدا شد، جستجوی باینری اجرا می شود O(log M)، کجا M اندازه محدوده است.
بنابراین، پیچیدگی زمانی کلی تقریباً است O(log N + log M).
بیان مشکل
با توجه به یک آرایه نامتناهی از اعداد صحیح مرتب شده، باید شاخص یک عدد هدف معین را پیدا کنیم. آرایه “بی نهایت” است، به این معنی که نمی توانیم اندازه آن را از قبل تعیین کنیم، بنابراین نمی توانیم فقط یک جستجوی باینری سنتی را مستقیماً اعمال کنیم.
بررسی اجمالی رویکرد
-
با یک محدوده کوچک شروع کنید: در ابتدا، فرض کنید که عنصر در محدوده کوچکی قرار دارد (مثلاً بین شاخص های 0 و 1).
-
به صورت پویا دامنه را افزایش دهید: اگر عنصر هدف در محدوده اولیه یافت نشد، برای جستجوی بیشتر، اندازه محدوده را دو برابر می کنیم. این رشد تصاعدی به ما امکان میدهد تا به سرعت در محدودهای که ممکن است هدف قرار گرفته باشد، حرکت کنیم.
-
جستجوی باینری در محدوده: هنگامی که محدوده مناسبی را که حاوی هدف است تعیین می کنیم، جستجوی باینری را برای یافتن موثر شاخص هدف اعمال می کنیم.
کد
public class InfiniteArraySearch {
public static void main(String[] args) {
// Define the array (for demonstration purposes, treat this as infinite)
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int target = 6;
// Call the function to find the target element
int result = findElementInInfiniteArray(arr, target);
System.out.println("Element found at index: " + result);
}
// Function to find the target in the infinite array
static int findElementInInfiniteArray(int[] arr, int target) {
// Start with a small range
int start = 0;
int end = 1;
// Dynamically increase the range until the target is within bounds
while (target > arr[end]) {
int newStart = end + 1; // Update start to one after the current end
end = end + (end - start + 1) * 2; // Double the range
start = newStart; // Move the start to newStart
}
// Perform binary search within the determined range
return binarySearch(arr, target, start, end);
}
// Standard binary search implementation
static int binarySearch(int[] arr, int target, int start, int end) {
while (start end) {
int mid = start + (end - start) / 2;
if (target arr[mid]) {
end = mid - 1; // Move the end to the left
} else if (target > arr[mid]) {
start = mid + 1; // Move the start to the right
} else {
return mid; // Element found
}
}
return -1; // Element not found
}
}
توضیح آیین نامه
1. عملکرد اصلی
تابع main یک آرایه نمونه را تعریف می کند arr
و یک مقدار هدف 6
. برای سادگی، ما آرایه را در اینجا محدود فرض میکنیم، اما از نظر مفهومی، آن را بینهایت در نظر میگیریم. سپس تابع اصلی فراخوانی می کند findElementInInfiniteArray
برای جستجوی هدف، و در صورت یافتن فهرست را چاپ می کند.
2. گسترش دامنه (گسترش خطی منطقه جستجو)
در findElementInInfiniteArray
روش:
- ما با فرض اینکه عنصر در محدوده قرار دارد شروع می کنیم [0, 1].
- اگر هدف بزرگتر از مقدار در است
arr[end]
، به این معنی است که هدف در محدوده فعلی نیست. بنابراین، ما محدوده را به صورت تصاعدی با دو برابر کردن آن گسترش می دهیم (end = end + (end - start + 1) * 2
). این به طور موثر به ما اجازه می دهد تا در هر تکرار زمینه بیشتری را پوشش دهیم.
3. جستجوی باینری
زمانی که بدانیم هدف باید بین آن قرار گیرد start
و end
، ما یک جستجوی باینری استاندارد انجام می دهیم. جستجوی باینری روشی کارآمد برای جستجو در آرایه های مرتب شده است، زیرا در هر مرحله فضای جستجو را به نصف کاهش می دهد. مقایسه های کلیدی عبارتند از:
- اگر هدف کمتر از عنصر میانی باشد (
arr[mid]
، نیمه چپ را جستجو کنید. - اگر هدف بزرگتر است، نیمه سمت راست را جستجو کنید.
- اگر هدف با عنصر میانی مطابقت دارد، شاخص آن را برگردانید.
4. موارد لبه
- اگر هدف کوچکتر از کوچکترین عنصر آرایه باشد، یا اگر آرایه اصلاً هدف را نداشته باشد، الگوریتم باز خواهد گشت.
-1
.
پیچیدگی زمانی
-
گسترش دامنه: محدوده با هر تکرار دو برابر می شود، بنابراین طول می کشد
O(log N)
عملیات برای یافتن محدوده مناسب جایی که هدف قرار دارد. -
جستجوی باینری: هنگامی که محدوده پیدا شد، جستجوی باینری اجرا می شود
O(log M)
، کجاM
اندازه محدوده است.
بنابراین، پیچیدگی زمانی کلی تقریباً است O(log N + log M)
.