Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में क्रमबद्ध सरणी में फ्लोर खोजना

समस्या विवरण

इस समस्या में, हमें एक क्रमबद्ध सरणी arr[] और एक पूर्णांक मान x दिया गया है। हमारा कार्य क्रमबद्ध सरणी में फ्लोर खोजने के लिए एक प्रोग्राम बनाना है।

क्रमबद्ध सरणी arr में X का फ्लोर सरणी arr[] का सबसे बड़ा तत्व है जो x से छोटा या बराबर है।

उदाहरण

इनपुट: arr[] = {2, 5, 6, 8, 9, 12, 21, 25}, x = 10
आउटपुट: 9

व्याख्या - उपरोक्त सरणी में 9 सबसे बड़ी संख्या है जो 10 से छोटी या बराबर है।

हल का दृष्टिकोण

विधि 1: रैखिक खोज (O(N))

समस्या का एक सरल समाधान सीधे सरणी को पार करके और शर्त को संतुष्ट करने वाले तत्वों को खोजना है। सरणी को पार करते समय, हम प्रत्येक तत्व की जांच करेंगे, यदि यह x से बड़ा है, तो पिछले तत्व को x के फ्लोर के रूप में वापस करें।

#include <iostream> 
using namespace std; 

int findFloorSortedArray(int arr[], int n, int x) {
    if (x >= arr[n - 1])
        return (n - 1);
    if (x < arr[0])
        return -1;
    for (int i = 1; i < n; i++)
        if (arr[i] > x)
            return (i - 1);
    return -1;
}

int main() {
    int arr[] = {2, 5, 6, 8, 9, 12, 21, 25};
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 10;
    int floorIndex = findFloorSortedArray(arr, n, x);
    if (floorIndex == -1)
        cout << "सरणी में " << x << " का फ्लोर मौजूद नहीं है";
    else
        cout << "सरणी में " << x << " का फ्लोर है " << arr[floorIndex];
    return 0;
}

विधि 2: बाइनरी खोज (O(log N)) - इष्टतम

समस्या को हल करने का एक वैकल्पिक तरीका बाइनरी खोज एल्गोरिदम का उपयोग करना है क्योंकि सरणी क्रमबद्ध है और हमारा कार्य मान खोजने पर आधारित है। इस समाधान में, हम सरणी के मध्य इंडेक्स पर तत्व खोजेंगे। फिर मध्य तत्व के अनुसार, हम संख्या को पहले आधे (छोटे आधे) या दूसरे आधे (बड़े आधे) में खोजेंगे। और तब तक जारी रखेंगे जब तक पूरी सरणी पार न हो जाए या तत्व उप-सरणी के मध्य में मिल जाए।

#include <iostream> 
using namespace std; 

int findFloorSortedArray(int arr[], int start, int end, int x) {
    if (start > end)
        return -1;
    if (x >= arr[end])
        return end;
    
    int mid = (start + end) / 2;
    if (arr[mid] == x)
        return mid;
    if (mid > 0 && arr[mid - 1] <= x && x < arr[mid])
        return mid - 1;
    if (x < arr[mid])
        return findFloorSortedArray(arr, start, mid - 1, x);
    return findFloorSortedArray(arr, mid + 1, end, x);
}

int main() {
    int arr[] = {2, 5, 6, 8, 9, 12, 21, 25};
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 10;
    int floorIndex = findFloorSortedArray(arr, 0, n - 1, x);
    if (floorIndex == -1)
        cout << "सरणी में " << x << " का फ्लोर मौजूद नहीं है";
    else
        cout << "सरणी में " << x << " का फ्लोर है " << arr[floorIndex];
    return 0;
}

आउटपुट

सरणी में 10 का फ्लोर है 9

जटिलता विश्लेषण

विधिसमय जटिलतास्पेस जटिलता
रैखिक खोजO(N)O(1)
बाइनरी खोजO(log N)O(log N) पुनरावर्ती / O(1) पुनरावृत्तिमूलक

संबंधित अवधारणाएं

  • सीलिंग: ≥ x का सबसे छोटा तत्व
  • std::lower_bound: पहला तत्व ≥ x (सीलिंग के लिए इंडेक्स)
  • std::upper_bound: पहला तत्व > x (फ्लोर के लिए: upper_bound - 1)
  1. - C++ फंक्शन में 2D ऐरे पास करना

    ऐरे को फंक्शन में तर्क के रूप में पास किया जा सकता है। इस प्रोग्राम में, हम इसे फंक्शन में पास करके 2 डायमेंशनल ऐरे के तत्वों को प्रदर्शित करेंगे। एल्गोरिदम Begin 2D ऐरे n[][] को फंक्शन show() में पास किया जाता है। फंक्शन show() को कॉल करें, ऐरे n (n) को नेस्टेड फॉर लूप का उपयोग करके ट्रैवर

  1. - C++ प्रोग्राम: सॉर्टेड ऐरे कार्यान्वयन (सिलेक्शन सॉर्ट)

    सॉर्टेड ऐरे ऐरे जिसमें तत्व क्रमबद्ध क्रम में हों (संख्यात्मक, वर्णानुक्रमिक, आदि)। कई सॉर्टिंग एल्गोरिदम: बबल सॉर्ट, इन्सर्शन सॉर्ट, सिलेक्शन सॉर्ट, मर्ज सॉर्ट, क्विक सॉर्ट, हीप सॉर्ट। सिलेक्शन सॉर्ट अनसॉर्टेड भाग में सबसे छोटा तत्व ढूंढकर उसे शुरुआत से स्वैप करता है। O(n²) समय जटिलता। C++ प्रोग

  1. - C++ फ़ंक्शन में ऐरे पास करना

    C++ पूरे ऐरे को फ़ंक्शन में आर्गुमेंट के रूप में पास करने की अनुमति नहीं देता। हालांकि, आप ऐरे के नाम को बिना इंडेक्स के निर्दिष्ट करके ऐरे का पॉइंटर पास कर सकते हैं। यदि आप सिंगल-डायमेंशन ऐरे को फ़ंक्शन में आर्गुमेंट के रूप में पास करना चाहते हैं, तो आपको फ़ंक्शन फॉर्मल पैरामीटर को निम्नलिखित तीन