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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

最长上升子序列 java_最长上升子序列 O(nlogn)解法 (java)

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最长上升子序列 java_最长上升子序列 O(nlogn)解法 (java) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最長遞增子序列問題:在一列數中尋找一些數,這些數滿足:任意兩個數a[i]和a[j],若i

設dp[i]表示以i為結尾的最長遞增子序列的長度,則狀態轉移方程為:

dp[i] = max{dp[j]+1}, 1<=j

這樣簡單的復雜度為O(n^2),其實還有更好的方法。

考慮兩個數a[x]和a[y],x

按dp[t]=k來分類,只需保留dp[t]=k的所有a[t]中的最小值,設d[k]記錄這個值,d[k]=min{a[t],dp[t]=k}。

這時注意到d的兩個特點(重要):

1.?d[k]在計算過程中單調不升;

2.?d數組是有序的,d[1]

利用這兩個性質,可以很方便的求解:

1. 設當前已求出的最長上升子序列的長度為len(初始時為1),每次讀入一個新元素x:

2. 若x>d[len],則直接加入到d的末尾,且len++;(利用性質2)

否則,在d中二分查找,找到第一個比x小的數d[k],并d[k+1]=x,在這里x<=d[k+1]一定成立(性質1,2)。

/**

.最長遞增子序列O(nlogn)算法:

.狀態轉移方程:f[i] = max{f[i],f[j]+1},1<=j

.分析:加入x=f[y],則x相對于y更有潛力。

.首先根據f[]值分類,記錄滿足f[t]=k的最小的值a[t],記d[k]=min{a[t]},f[t]=k.

. 1.發現d[k]在計算過程中單調不上升

. 2.d[1]

.解法:

.1. 設當前最長遞增子序列為len,考慮元素a[i];

.2. 若d[len]

. 否則,在d[0-len]中二分查找,找到第一個比它小的元素d[k],并d[k+1]=a[i].()

.*/

/**

* Created by guojun on 2015/9/25.

*/

public class MaxUpSequence {

public static void main(String[] args) {

int[] a = new int[20];

for (int i = 0; i < a.length; i++) {

a[i] = (int)( Math.random() * 100);

System.out.print(a[i] + "\t");

}

System.out.println();

int[] b = new int[a.length];

b[0] = a[0];

int len = findSeq(a, b);

System.out.println(len);

}

public static int BinarySerch(int key, int[] a, int low, int high) {

while (low <= high) {

int mid = low + (high - low) / 2;

if (key > a[mid] && key < a[mid + 1]) {

return mid+1;

} else if (key > a[mid]) {

low = mid + 1;

} else if (key < a[mid]) {

high = mid - 1;

}

}

return 0;

}

public static int findSeq(int[] a, int[] b) {

if (a.length == 1) return 1;

int len = 1;

for (int i = 1; i < a.length; i++) {

if (a[i] > b[len - 1]) {

b[len] = a[i];

len++;

} else if (a[i] < b[len - 1]) {

int j = BinarySerch(a[i], b, 0, len - 1);

b[j] = a[i];

}

}

return len;

}

}

總結

以上是生活随笔為你收集整理的最长上升子序列 java_最长上升子序列 O(nlogn)解法 (java)的全部內容,希望文章能夠幫你解決所遇到的問題。

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