ภาพรวม
โปรแกรม C++ นี้สาธิตการหา Peak Element (องค์ประกอบที่มีค่ามากกว่าหรือเท่ากับเพื่อนบนทั้งสองข้าง) ในอาร์เรย์โดยใช้วิธี Binary Search ซึ่งมีความซับซ้อนด้านเวลา O(log n) อัลกอริธึมจะคืนค่า Peak แรกที่พบ
อัลกอริธึม
- ฟังก์ชัน
PeakElement()รับพารามิเตอร์: อาร์เรย์arr, ดัชนีเริ่มต้นstart, และดัชนีสิ้นสุดend - คำนวณดัชนีกลาง
mid = (start + end + 1) / 2 - ตรวจสอบเงื่อนไข:
- ถ้า
midอยู่ขอบเขตและค่าที่midมากกว่าเพื่อนบน → คืนค่าmid - ถ้าค่าที่
midมากกว่าเพื่อนบนทั้งสองข้าง → คืนค่าmid - ถ้าค่าข้างขวา (
mid+1) มากกว่า → เรียกฟังก์ชันซ้ำกับส่วนขวา - ถ้าค่าข้างซ้าย (
mid-1) มากกว่า → เรียกฟังก์ชันซ้ำกับส่วนซ้าย
- ถ้า
โค้ดตัวอย่าง
#include <iostream>
using namespace std;
int PeakElement(int a[], int start, int end) {
int mid = (end + start + 1) / 2;
// ตรวจสอบขอบเขต
if ((a[mid] > a[mid+1] && mid == start) || (a[mid] > a[mid-1] && mid == end)) {
return a[mid];
}
// Peak อยู่ตรงกลาง
else if (a[mid] > a[mid-1] && a[mid] > a[mid+1]) {
return a[mid];
}
// ไปทางขวา
else if (a[mid] <= a[mid+1]) {
return PeakElement(a, mid+1, end);
}
// ไปทางซ้าย
else {
return PeakElement(a, start, mid-1);
}
}
int main() {
int n;
cout << "Enter the number of data element: ";
cin >> n;
int arr[n];
for (int i = 0; i < n; i++) {
cout << "Enter element " << i+1 << ": ";
cin >> arr[i];
}
int peak = PeakElement(arr, 0, n-1);
cout << "\nThe peak element of the given array is: " << peak;
return 0;
}
ผลลัพธ์ตัวอย่าง
Enter the number of data element: 5
Enter element 1: 45
Enter element 2: 26
Enter element 3: 70
Enter element 4: 60
Enter element 5: 15
The peak element of the given array is: 70
คำอธิบายเพิ่มเติม
Peak Element หมายถึงองค์ประกอบที่มีค่ามากกว่าหรือเท่ากับองค์ประกอบที่อยู่ติดกันทั้งสองข้าง (สำหรับองค์ประกอบขอบเขต ต้องมากกว่าเพื่อนบนเพียงข้างเดียว) วิธี Binary Search ช่วยลดความซับซ้อนจาก O(n) เป็น O(log n) โดยการตัดครึ่งพื้นที่ค้นหาในแต่ละขั้นตอน