Go語言實現中位數的中位數演算法


中位數是在資料集排序後位於中間的元素。中位數的中位數演算法是一種強大的技術,用於在一個未排序的陣列中找出中位數元素。在本文中,我們將使用兩種方法(遞迴方法和迭代方法)在Go語言中實現中位數的中位數演算法。

解釋

中位數的中位數演算法是一種高效的技術,用於確定未排序陣列中的中位數值。它引入了兩種不同的方法:遞迴方法和迭代方法。

遞迴方法:引入了findMedianRecursive函式來遞迴計算中位數。如果陣列大小很小(5個或更少元素),則對其進行排序並返回中間值。對於較大的陣列,該函式計算子陣列的中位數,選擇中位數的中位數作為樞軸,並根據樞軸對陣列進行分割槽。該過程遞迴進行,直到找到最終的中位數。

Unsorted array: [9, 4, 7, 2, 8, 1, 6, 5, 3]
Sorted array: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Output: 5

迭代方法:程式提供了findMedianIterative函式,該函式將陣列迭代地分解為大小為5的子陣列。它計算子陣列的中位數,使用這些中位數更新陣列,並迭代直到確定最終的中位數。

演算法

  • 如果陣列arr的長度小於或等於5,則對陣列進行排序並返回中間元素作為中位數。將陣列arr劃分為大小為5的子陣列,最後一個子陣列可能包含較少的元素。

  • 對每個子陣列遞迴應用中位數的中位數演算法以找到它們的中位數。找到上一步中獲得的中位數的中位數,這將成為樞軸元素。

  • 根據樞軸元素對原始陣列arr進行分割槽,將較小的元素放在左側,較大的元素放在右側。

  • 如果樞軸元素位於索引k處,則將k與所需的中位數索引進行比較:如果k等於所需的中位數索引,則返回樞軸元素作為中位數。如果k大於所需的中位數索引,則對左側子陣列遞迴應用中位數的中位數演算法。

  • 如果k小於所需的中位數索引,則對右側子陣列遞迴應用中位數的中位數演算法。重複此過程,直到找到所需的中位數。

語法

func findMedianRecursive(arr []int) int

語法定義了一個名為findMedianRecursive的函式,該函式接受整數切片arr作為輸入。該函式旨在返回一個表示中位數元素的整數。

func findMedianIterative(arr []int) int

語法聲明瞭一個名為findMedianIterative的函式,該函式接受整數切片arr作為引數。透過使用中位數的中位數演算法的迭代方法,此函式迭代地計算並返回提供的未排序陣列的中位數。

示例

在這個例子中,我們將使用遞迴方法在Go語言中實現中位數的中位數演算法,以找到未排序陣列的中位數,這裡我們有一個包含元素[9, 4, 7, 2, 8, 1, 6, 5, 3]的未排序陣列arr。我們呼叫findMedianRecursive函式,並將陣列作為輸入傳遞。該函式應用中位數的中位數演算法的遞迴方法來查詢中位數。計算出的中位數為5,然後將其列印為輸出。

package main

import (
	"fmt"
	"sort"
)

func findMedianRecursive(arr []int) int {
	length := len(arr)

	if length <= 5 {
		sort.Ints(arr)
		return arr[length/2]
	}

	numGroups := length / 5
	if length%5 != 0 {
		numGroups++
	}

	medians := make([]int, numGroups)

	for i := 0; i < numGroups; i++ {
		start := i * 5
		end := start + 5
		if end > length {
			end = length
		}
		subarray := arr[start:end]
		medians[i] = findMedianRecursive(subarray)
	}

	pivot := findMedianRecursive(medians)

	left := make([]int, 0)
	right := make([]int, 0)
	equal := make([]int, 0)
	for _, num := range arr {
		if num < pivot {
			left = append(left, num)
		} else if num > pivot {
			right = append(right, num)
		} else {
			equal = append(equal, num)
		}
	}

	desiredIndex := len(left)

	if desiredIndex < len(left) {
		return findMedianRecursive(left)
	} else if desiredIndex >= len(left)+len(equal) {
		return findMedianRecursive(right)
	} else {
		return pivot
	}
}

func main() {
	arr := []int{9, 4, 7, 2, 8, 1, 6, 5, 3}
	median := findMedianRecursive(arr)
	fmt.Println("Median:", median)
}

輸出

Median: 7

示例

在這個例子中,我們將使用迭代方法在Go語言中實現中位數的中位數演算法,以找到未排序陣列的中位數,這裡我們有一個包含元素[9, 4, 7, 2, 8, 1, 6, 5, 3]的未排序陣列。透過應用中位數的中位數演算法的迭代方法,我們計算出中位數為5。這種方法包括將陣列劃分為子陣列,計算它們的中位數,並遞迴縮小範圍,直到找到所需的中位數。

package main

import (
	"fmt"
	"sort"
)

func findMedianIterative(arr []int) int {
	length := len(arr)

	for length > 5 {
		medians := make([]int, 0)
		numGroups := length / 5

		if length%5 != 0 {
			numGroups++
		}

		for i := 0; i < numGroups; i++ {
			start := i * 5
			end := start + 5
			if end > length {
				end = length
			}
			subarray := arr[start:end]
			sort.Ints(subarray)
			medians = append(medians, subarray[len(subarray)/2])
		}

		arr = medians
		length = len(arr)
	}

	sort.Ints(arr)
	return arr[length/2]
}

func main() {
	arr := []int{9, 4, 7, 2, 8, 1, 6, 5, 3}
	median := findMedianIterative(arr)
	fmt.Println("Median:", median)
}

輸出

Median: 7

現實生活中的應用

醫療診斷

在醫療診斷中,中位數的中位數演算法可用於查詢患者資料的中間值,例如血壓讀數或膽固醇水平。這有助於醫生識別趨勢並做出明智的決策,確保對患者健康狀況進行準確的評估。

財務分析

財務分析師可以將該演算法應用於大型股票價格或經濟指標資料集。這有助於確定中位數,從而深入瞭解市場趨勢和穩定性,尤其是在異常值可能扭曲結果的情況下。

結論

中位數的中位數演算法是一種強大的技術,可以幫助醫院查詢患者資料的中間值,並幫助財務分析師分析資料集。在本文中,我們研究瞭如何在Go語言中實現中位數的中位數演算法以及如何在未排序的陣列中找到中位數元素。這裡我們使用了兩種方法:遞迴方法和迭代方法。這些方法提供了計算中位數的有效方法,時間複雜度為O(n)。

更新於:2023年9月7日

瀏覽量:297

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.