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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

問題

給定兩個大小為 m 和 n 的有序數組 nums1 和 nums2。找出這兩個有序數組的中位數。假設 nums1 和 nums2 不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

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

合并兩個有序數組來獲得中位數

1、先將兩個有序數組合并為一個有序數組

2、再獲取中位數

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

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

時間復雜度是O(m+n),空間復雜度是O(m+n)。

優化第一個求解方法

上一個算法是將兩個有序數組合并為一個有序數組再計算中位數位置。我們可以先計算中位數位置,將兩個有序數組元素逐一比較排序過程中,當索引位置到達中位數時停止。

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

二分查找

  • 一個有序數組的中位數

長度為偶數:

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

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

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

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

長度為基數:

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

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

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

則中位數是 a[i]

  • 兩個有序數組的中位數

兩個有序數組長度之和為偶數:

兩個a和b有序數組的長度分別是m和n。對a數組的一個劃分i和對b數組的一個劃分j,使得a數組的左半部分同b數組的左半部分看作合并后有序數組c的左半部分;而a數組的右半部分同b數組的右半部分看作合并后有序數組c的右半部分。假設有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])

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

兩個有序數組長度之和為基數:

兩個a和b有序數組的長度分別是m和n。對a數組的一個劃分i和對b數組的一個劃分j,使得a數組的左半部分同b數組的左半部分看作合并后有序數組c的左半部分;而a數組的右半部分同b數組的右半部分看作合并后有序數組c的右半部分。假設有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])

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

分析求解:

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

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

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

我們可以在數組a中,通過折半查找來取得劃分i。其中IMIN為開始索引0,IMAX為數組a長度m

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

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

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

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

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

注意:

1、數組a和數組b長度的關系

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

1)

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

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

因為i<=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 =>

因為i>=0,j=(m+n)/2-i<=(m+n)/2 =>

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

m<=n

3)

總結:當m<=n時,0<=i<=m,可以保證0<=j<=n。所以,在算法中,始終要保持數組a的長度要不大于數組b的長度。

數組a可能為空數組

2、i,j移動過程中的越界問題

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

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

這兩種情況要單獨判斷:

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

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

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

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

這兩種情況要單獨判斷:

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

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

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

性能分析

隨機生成兩個有序數組進行性能測試:

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.

二分查找法性能最優,符合預期。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色大片儿 | 一级久久久久久久 | 伊人狼人综合 | 日韩国产一区二区 | 97人人爽| 全部免费毛片在线播放高潮 | 国产明星换脸xxxx色视频 | 极品少妇在线观看 | 色香av| 人体写真 福利视频 | 国产欧美一区二区 | 第一色网站 | 国产亚洲色婷婷久久99精品91 | 欧美亚洲精品在线观看 | 99视频在线精品 | 国内黄色一级片 | 欧美激情69 | 亚洲情se | 一区二区三区免费观看视频 | 99精品久久| 精品久久ai | 久久dvd | 欧美丰满老妇熟乱xxxxyyy | 亚洲影视一区 | 欧美日韩国产免费观看 | 久久99久久99精品免观看软件 | 在线观看亚洲大片短视频 | 婷婷午夜激情 | www.欧美精品 | 日本性爱视频在线观看 | 精品一区免费观看 | 一呦二呦三呦精品网站 | 蜜桃视频一区二区三区在线观看 | 亚洲欧美韩国 | 麻豆视屏| 国产精品视频福利 | 97干视频| 人人妻一区二区三区 | 午夜精品福利电影 | 影院色原网站 | 关之琳三级做爰 | 91亚洲精| 久久精品国产亚洲7777 | 人人干人| 亚洲欧美日韩精品永久在线 | 青草草在线 | 成人免费在线网站 | 色爱av综合 | 亚洲色图一区二区 | 中文字幕在线二区 | 蜜桃视频中文字幕 | 91手机在线视频 | 精品国产乱码久久久久久1区二区 | 国产精品久久久久久久久久直播 | 日韩白浆| 91麻豆精品国产91久久久久久 | 国产chinese男男网站大全 | 久久久久一区二区三区四区 | 久久精品高清 | av资源中文在线 | 国产www在线观看 | 中国黄色1级片 | 久久精品国产亚洲 | 欧美国产日韩综合 | 色婷婷av一区二区三区之e本道 | 中国超碰 | 风流少妇 | 欧美日韩免费在线视频 | 亚洲精华国产精华精华液网站 | 极品美女销魂一区二区三区 | 狠狠操人人干 | h片在线观看| 欧美日韩大片在线观看 | 精品二区在线观看 | 国产精品久久久久久久久久久免费看 | 天天干天天添 | 天天射综合网站 | 激情av小说 | 色av吧 | 精品午夜福利视频 | 91香焦视频 | 国产66页| 永久在线观看 | 黄色1级大片| 亚洲av无码久久精品狠狠爱浪潮 | 九九热精品在线 | 一区视频网站 | 黄视频在线免费看 | 亚洲精品视频一区二区三区 | 欧美特级黄色片 | 91精品国产一区 | 欧美一区二区不卡视频 | 日韩精品一区二区三区久久 | 成人无码av片在线观看 | 国产亚洲精品女人久久久久久 | 中文字幕一区二区三区精彩视频 | 日本护士取精xxxxxhd | 日本污视频在线观看 | 冈本视频在线观看 |