मेरे पास CGFloats की एक सरणी है। मेरे पास एक मनमाना मान a भी है जो कोई भी CGFloat हो सकता है। मेरा प्रश्न यह है कि, मैं कुशलतापूर्वक कैसे पता लगा सकता हूं कि a के बीच कौन से दो सूचकांक हैं। एक साइड नोट के रूप में, a कभी भी न्यूनतम या अधिकतम ऐरे से नीचे या अधिक नहीं होगा, इसलिए इसके बारे में चिंता करने की कोई आवश्यकता नहीं है।

एक सरलीकृत उदाहरण के लिए, मेरे पास हो सकता है:

let array: [CGFloat] = [4, 7, 10, 22, 23, 25, 67]

// a can be any random number, this initialization is for the example
let a = 14

// some algorithm that calculates indexes
// code returns index 2 and 3 (or it returns items 10, 22)

मैंने लूप के लिए शामिल एक विधि विकसित की है, हालांकि, सूची जितनी बड़ी होगी, कोड उतना ही अक्षम होगा। क्या वहां कोई बुद्धिमान, और अधिक कुशल कोड है?

पूरी सहायताके लिए शुक्रिया :)

0
Brian.Masse2 28 सितंबर 2020, 16:19

2 जवाब

सबसे बढ़िया उत्तर

यदि आपकी सरणी हमेशा उपयोग की जाती है:

let array: [CGFloat] = [4, 7, 10, 22, 23, 25, 67]
let a: CGFloat = 14
if let maxIndex = array.firstIndex(where: { $0 > a }), maxIndex > 0 {
    print("a between \(maxIndex - 1) and \(maxIndex) indexes")
}
0
Kstin 28 सितंबर 2020, 16:41

आप जो खोज रहे हैं उसे मिड बाइनरी सर्च कहा जाता है। इस तरह के दृष्टिकोण के कई उदाहरण हैं उदाहरण #2। ध्यान दें कि यदि आप पहले मान से कम मान पास करते हैं तो यह प्रारंभ अनुक्रमणिका लौटाएगा और अंतिम मान से अधिक मान यह अंतिम अनुक्रमणिका लौटाएगा।

extension Collection where Element: Comparable, Index == Int {
    func binarySearch(_ element: Element) -> Index {
        var low = 0
        var high = count - 1
        while low < high {
            let mid = low + ((high - low + 1) / 2)
            let current = self[mid]
            if current == element {
                return mid
            } else if current < element {
                low = mid
            } else {
                high = mid - 1
            }
        }
        return low
    }
}

let array: [CGFloat] = [4, 7, 10, 22, 23, 25, 67]
let a = 14
let indexA = array.binarySearch(CGFloat(a))  // 2
let indexB = indexA + 1                      // 3
2
Leo Dabus 28 सितंबर 2020, 18:39