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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

O(logn*2^logn)和O(n*logn)算法

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 O(logn*2^logn)和O(n*logn)算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.

for(int i = 1;i < n; i <<=1)for(int j = 0; j < i; j++)

這個嵌套循環:1+2+4+…+2^[log(n-1)]=2^[logn]-1=O(n);

2.

for(int i = 0; i < = n; i ++){for(int j = 1; j < i; j+=j) ...

為O(logn*2^logn)。

3.

現在又遇到了大O界O(n*logn)

我們知道log1+log2+log3+…+logn的確界為n*logn,現在看看這個大O界:

分析如下:

O(nlogn)的算法關鍵是它建立了一個數組c[],c[i]表示長度為i的不下降序列中結尾元素的最小值,用K表示數組目前的長度,算法完成后K的值即為最長不下降子序列的長度。

具體點來講:
設當前的以求出的長度為K,則判斷a[i]和c[k]:
3.1.如果a[i]>=c[k],即a[i]大于長度為K的序列中的最后一個元素,這樣就可以使序列的長度增加1,即K=K+1,然后現在的c[k]=a[i];

如果a[i]<c[k],那么就在c[1]...c[k]中找到最大的j,使得c[j]<a[i],然后因為c[j]<a[i],所以a[i]大于長度為j的序列的最后一個元素,那么就可以更新長度為j+1的序列的最后一個元素,即c[j+1]=a[i]。 算法復雜度的分析: 因為共有n個元素要進行計算;每次計算又要查找n次,所以復雜度是O(n^2),但是,注意到c[]數組里的元素的單調遞增的,所以我們可以用二分法,查找變成了logn次。這樣算法的復雜度就變成了O(nlogn)。 include<iostream> using namespace std;int a[101],c[101];int find(int len,int n){int left=1,right=len,mid;while(left<=right){mid=(left+right)/2;if(c[mid]==n) return mid;else if(c[mid]>n) right=mid-1;else if(c[mid]<n) left=mid+1;}return left;}int main() {int n,i,j,k,len;cin>>n;for(i=1;i<=n;i++)cin>>a[i];c[1]=a[1];len=1;for(i=1;i<=n;i++){j=find(len,a[i]);c[j]=a[i];if(j>len)len=j; }cout<<len;system("pause");return 0;} 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的O(logn*2^logn)和O(n*logn)算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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