日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数组越界怎么判断_算法连载之求解两个有序数组的中位数

發(fā)布時(shí)間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组越界怎么判断_算法连载之求解两个有序数组的中位数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問(wèn)題

給定兩個(gè)大小為 m 和 n 的有序數(shù)組 nums1 和 nums2。找出這兩個(gè)有序數(shù)組的中位數(shù)。假設(shè) nums1 和 nums2 不會(huì)同時(shí)為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數(shù)是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

則中位數(shù)是 (2 + 3)/2 = 2.

合并兩個(gè)有序數(shù)組來(lái)獲得中位數(shù)

1、先將兩個(gè)有序數(shù)組合并為一個(gè)有序數(shù)組

2、再獲取中位數(shù)

偶數(shù)情況中位數(shù)索引分別為:(m+n)/2-1,(m+n)/2。將二值求平均數(shù)。

計(jì)數(shù)情況中為數(shù)索引為:(m+n)/2

時(shí)間復(fù)雜度是O(m+n),空間復(fù)雜度是O(m+n)。

優(yōu)化第一個(gè)求解方法

上一個(gè)算法是將兩個(gè)有序數(shù)組合并為一個(gè)有序數(shù)組再計(jì)算中位數(shù)位置。我們可以先計(jì)算中位數(shù)位置,將兩個(gè)有序數(shù)組元素逐一比較排序過(guò)程中,當(dāng)索引位置到達(dá)中位數(shù)時(shí)停止。

時(shí)間復(fù)雜度是O((m+n)/2+1)=O(m+n),空間復(fù)雜度是((m+n)/2+1)=O(m+n)。

二分查找

  • 一個(gè)有序數(shù)組的中位數(shù)

長(zhǎng)度為偶數(shù):

數(shù)組a,索引位置初始為0,長(zhǎng)度為m。索引 i 將有序數(shù)組劃分為左右兩個(gè)長(zhǎng)度相等的部分,i = (m - 0) / 2 且必須滿足如下兩個(gè)條件:

1、length(a[0, i)) = length(a[i, m))

2、a[i-1] <= a[i]

則中位數(shù)是 (a[i-1] + a[i]) / 2

長(zhǎng)度為基數(shù):

數(shù)組a,索引位置初始為0,長(zhǎng)度為m。索引 i 將有序數(shù)組劃分為左右兩個(gè)部分,其中左邊部分比右邊部分少一個(gè)元素,i = (m - 0) / 2 且必須滿足如下兩個(gè)條件:

1、length(a[0, i)) + 1 = length(a[i, m))

2、a[i-1] <= a[i]

則中位數(shù)是 a[i]

  • 兩個(gè)有序數(shù)組的中位數(shù)

兩個(gè)有序數(shù)組長(zhǎng)度之和為偶數(shù):

兩個(gè)a和b有序數(shù)組的長(zhǎng)度分別是m和n。對(duì)a數(shù)組的一個(gè)劃分i和對(duì)b數(shù)組的一個(gè)劃分j,使得a數(shù)組的左半部分同b數(shù)組的左半部分看作合并后有序數(shù)組c的左半部分;而a數(shù)組的右半部分同b數(shù)組的右半部分看作合并后有序數(shù)組c的右半部分。假設(shè)有i、j存在,則需滿足如下條件:

1、length(a[0, i)) + length(b[0, j]) = length(a[i, m)) + length(b[j, n])

(i-0)+(j-0)=(m-i)+(n-j)

i=(m+n)/2-j

2、max(a[i-1], b[j-1]) <= min(a[i], b[j])

則中位數(shù)是 (max(a[i-1], b[j-1]) + min(a[i], b[j])) / 2

兩個(gè)有序數(shù)組長(zhǎng)度之和為基數(shù):

兩個(gè)a和b有序數(shù)組的長(zhǎng)度分別是m和n。對(duì)a數(shù)組的一個(gè)劃分i和對(duì)b數(shù)組的一個(gè)劃分j,使得a數(shù)組的左半部分同b數(shù)組的左半部分看作合并后有序數(shù)組c的左半部分;而a數(shù)組的右半部分同b數(shù)組的右半部分看作合并后有序數(shù)組c的右半部分。假設(shè)有i、j存在,則需滿足如下條件:

1、length(a[0, i)) + length(b[0, j]) + 1 = length(a[i, m)) + length(b[j, n])

(i-0)+(j-0)+1=(m-i)+(n-j)

i=(m+n-1)/2-j

2、max(a[i-1], b[j-1]) <= min(a[i], b[j])

則中位數(shù)是 min(a[i], b[j])

分析求解:

兩個(gè)有序數(shù)組長(zhǎng)度不管是基數(shù)還是偶數(shù),都需要滿足如上兩個(gè)條件。其中第二個(gè)條件相同,而第一個(gè)條件我們可以歸納簡(jiǎn)化為i=(m+n)/2-j,因?yàn)楫?dāng)m+n為基數(shù)時(shí) (m+n)/2-j = (m+n-1)/2-j。所以,只要找出數(shù)組a劃分i,則可以通過(guò)公式i=(m+n)/2-j,得到數(shù)組b劃分j,并且滿足如下兩個(gè)條件:

1、i=(m+n)/2-j

2、max(a[i-1], b[j-1]) <= min(a[i], b[j])

我們可以在數(shù)組a中,通過(guò)折半查找來(lái)取得劃分i。其中IMIN為開(kāi)始索引0,IMAX為數(shù)組a長(zhǎng)度m

1)將數(shù)組a折半 i = (IMAX - IMIN) / 2

2)其中a[i-1]<=a[i],b[j-1]<=b[j]一定是成立的。

若b[j-1]>a[i]不符合條件,i只有向后移動(dòng)一位變大,相應(yīng)的j向前移動(dòng)一位變小,才有可能符合條件b[j-1]<=a[i]。所以,此時(shí)的i并不是有效劃分,有效劃分在i+1~IMAX范圍內(nèi)。IMIN賦值為i+1,繼續(xù)執(zhí)行1)。

若a[i-1]>b[j]不符合條件,i只有向前移動(dòng)一位變小,相應(yīng)的j向后移動(dòng)一位變大,才有可能符合條件a[i-1]<=b[j]。所以,此時(shí)的i并不是有效劃分,有效劃分在IMIN~i-1范圍內(nèi)。IMAX為i-1,繼續(xù)執(zhí)行1)。

3)最后找到合適的i和j,就可以直接計(jì)算得到中位數(shù)。

注意:

1、數(shù)組a和數(shù)組b長(zhǎng)度的關(guān)系

必須保證0<=i<=m, 0<=j<=n;假設(shè)0<=i<=m成立,如果滿足0<=j<=n,m和n之間的關(guān)系。

1)

i=(m+n)/2-j =>

j=(m+n)/2-i =>

因?yàn)閕<=m,所以j=(m+n)/2-i>=(m+n)/2-m=(n-m)/2 =>

若(n-m)/2>=0,則j>=0 =>

m<=n

2)

i=(m+n)/2-j =>

j=(m+n)/2-i =>

因?yàn)閕>=0,j=(m+n)/2-i<=(m+n)/2 =>

若(m+n)/2<=n,則j<=n =>

m<=n

3)

總結(jié):當(dāng)m<=n時(shí),0<=i<=m,可以保證0<=j<=n。所以,在算法中,始終要保持?jǐn)?shù)組a的長(zhǎng)度要不大于數(shù)組b的長(zhǎng)度。

數(shù)組a可能為空數(shù)組

2、i,j移動(dòng)過(guò)程中的越界問(wèn)題

1)若b[j-1]>a[i]不符合條件,i只有向后移動(dòng)一位變大,相應(yīng)的j向前移動(dòng)一位變小,才有可能符合條件b[j-1]<=a[i]。

為保證數(shù)組不越界,j不能等于0,i不能等于m。

這兩種情況要單獨(dú)判斷:

當(dāng)j==0時(shí),左半部分的最大值是a[i-1],右半部分的最小值是min(a[i], b[0]);

當(dāng)i==m時(shí),左半部分的最大值是max(a[m-1], b[j-1]),右半部分的最小值是b[j]。

2)若a[i-1]>b[j]不符合條件,i只有向前移動(dòng)一位變小,相應(yīng)的j向后移動(dòng)一位變大,才有可能符合條件a[i-1]<=b[j]。所以,此時(shí)的i并不是有效劃分,有效劃分在0~i范圍內(nèi)。IMIN賦值為0,IMAX為i,繼續(xù)執(zhí)行1)。

為保證數(shù)組不越界,i不能等于0,j不能等于n。

這兩種情況要單獨(dú)判斷:

當(dāng)i==0時(shí),左半部分的最大值是b[j-1],右半部分的最小值是min(a[0], b[j]);

當(dāng)j==n時(shí),左半部分的最大值是max(a[i-1], b[n-1]),右半部分的最小值是a[i]。

時(shí)間復(fù)雜度是O(log(min(m,n))),空間復(fù)雜度是O(1)。

性能分析

隨機(jī)生成兩個(gè)有序數(shù)組進(jìn)行性能測(cè)試:

The Median is 512203030.5 by MergedSortedArrays solve(num1.length=42385384,num2.length=19210176), using time is 349 milliseconds.

The Median is 512203030.5 by OptimizingMergedSortedArrays solve(num1.length=42385384,num2.length=19210176), using time is 195 milliseconds.

The Median is 512203030.5 by Binary solve(num1.length=42385384,num2.length=19210176), using time is 0 milliseconds.

二分查找法性能最優(yōu),符合預(yù)期。

總結(jié)

以上是生活随笔為你收集整理的数组越界怎么判断_算法连载之求解两个有序数组的中位数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。