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;}

O(logn*2^logn)和O(n*logn)算法相关推荐

  1. Java算法时间复杂度的表示:o(1)、o(n)、 o(logn)、o(nlogn)

    在描述算法复杂度时,经常用到O(1).O(n).O(logn).O(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数 ...

  2. 奇葩面试题,O(logn)的底数是多少?

    大家好,我是老三,最近裸辞了,在面试. 前两天一个面试,只面了十分钟就结束了-- 事情是这样的: 面试官:你能说说HashMap的数据结构吗? 老三:数组+链表+红黑树,阿巴阿巴-- 面试官:那你说说 ...

  3. 【时间复杂度】详解O(logn)

    时间复杂度: (代码每行运行的次数总和,大O符号表示法:描述代码执行时间的增长变化趋势) 常见时间复杂度(按效率排序) O(1) < O(logn) < O(n) < O(nlogn ...

  4. 算法复杂度(1):直观地比较O(1),O(logn), O(n)

    我们在计算算法的时间.空间复杂度时经常看到 O(1),O(logn), O(n),O(n*logn),O(n^2),O(2^n),O(n!) 之前一直难以直观地明白它们之间究竟差别究竟有多大. 下图的 ...

  5. logN²是O(N)的

    logN²是O(N)的 答案:T 分析: logN²和(logN)²都是O(N),只要是PTA数据结构碰到就记住这个答案!!!(我们老师说的,我也不知到为什么,有大佬知道就请评论解答,感激!)

  6. (logN)²是O(N)的

    (logN)²是O(N)的. 答案:T 分析: (logN)²和logN²都是O(N)的,只要是在PTA数据结构的题目中碰到就记住这个答案!!!(我们老师说的)

  7. logN的底数究竟是多少

    问题: 关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多少. 解答: 算法中log级别的时间复杂度都是由于使用了分治思想,这个底数直接由分治的复杂度决定 ...

  8. 算法(4)数据结构:堆

    1.0 问题描述 实现数据结构:堆. 2.0 问题分析 堆一般使用数组来表示,其中某个节点下标i的两个子节点的下标为 2i+1 和 2i+2.堆是一棵完全二叉树. 堆有3种基本操作:创建,插入,删除. ...

  9. 如何从JavaScript中的给定数字中形成最小的数字

    by Prashant Yadav 通过Prashant Yadav 如何从JavaScript中的给定数字中形成最小的数字 (How to form the smallest possible nu ...

  10. 线段树 ---- D. Power Tree(离线dfs序+线段树维护树上多条路径和的技巧)

    题目链接 题目大意: 一开始给你只有一个点111的树,有qqq次询问.每次询问有两种操作 1pv1\;p\;v1pv 就是把最小的没加入的点,加入这个树,它的父亲是ppp,权值是vvv 2u2\;u2 ...

最新文章

  1. git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....
  2. 078_html5Canvas
  3. Tensorflow2.x.x全卷积神经网络(CNN)
  4. 虚拟服务器声卡,如何使用虚拟声卡?虚拟声卡安装教程!
  5. bzoj1966 [AHOI2005]病毒检测 结论+暴力
  6. 猫都能学会的Unity3D Shader入门指南(一)
  7. 网站长尾关键词优化指南
  8. MigrationSchemaMissing: Unableto createthe django_migrations
  9. Java实习日记(5)
  10. 怎样给word插入页码,点击进来有惊喜
  11. qt 5.12.1 下载安装详细教程
  12. push_back讲解
  13. Android输入事件从读取到分发三:InputDispatcherThread线程分发事件的过程
  14. 机器学习的L1、L2损失函数
  15. Excel高级功能 数据工具
  16. 支付宝玉伯:从前端到体验,如何把格局做大
  17. 绊脚石乃是进身之阶 jzoj 2017.8.15 B组
  18. 兰州举行闹元宵焰火晚会 百万市民争相观看
  19. Linux 下Nginx开启status用以监控状态信息
  20. Java.Net互操作技术介绍

热门文章

  1. “如果把所有的经济学家都放在一起,他们永远不会得出结论。 - 萧伯纳
  2. THREE TRACKS AT UNIVERSITY
  3. rice university phd application result
  4. iPad上面的扫描加水印免费软件推荐
  5. Redis过期策略及实现原理
  6. HTTP权威指南记录 ---- HTTP概述
  7. phpstorm主题
  8. 进入Ubuntu图形桌面的方法
  9. qt翻译---QTime
  10. 51`CTO下载中心——我的新爱