当前位置: 首页 > news >正文

荣耀官方网站手机商城网站建设介绍推广用语

荣耀官方网站手机商城,网站建设介绍推广用语,湖南好搜网站建设,上海比较好的设计工作室目录 1. 算法复杂度1.1 时间复杂度1.2 大O渐进表示法1.2.1 例子引入推导大O法1.2.2 举例 1.3 空间复杂度1.3.1 细分1.3.2 举例 2.什么是好的算法#xff1f;3. 影响程序运行时间的因数 1. 算法复杂度 算法在编写成可执行程序后#xff0c;运行时需要耗费时间资源和内存资源 。… 目录 1. 算法复杂度1.1 时间复杂度1.2 大O渐进表示法1.2.1 例子引入推导大O法1.2.2 举例 1.3 空间复杂度1.3.1 细分1.3.2 举例 2.什么是好的算法3. 影响程序运行时间的因数 1. 算法复杂度 算法在编写成可执行程序后运行时需要耗费时间资源和内存资源 。因此衡量一个算法的好坏一般是从时间和空间两个维度来衡量的即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢而空间复杂度主要衡量一个算法运行所需要的额外空间。 在计算机发展的早期计算机的存储容量很小所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展计算机的存储容量已经达到了很高的程度所以我们如今已经不需要再特别关注一个算法的空间复杂度。 1.1 时间复杂度 时间复杂度的定义在计算机科学中算法的时间复杂度是一个函数它定量描述了该算法的运行时间。一个算法执行所耗费的时间从理论上说是不能算出来的只有你把你的程序放在机器上跑起来才能知道。但是我们需要每个算法都上机测试吗是可以都上机测试但是这很麻烦所以才有了时间复杂度这个分析方式。 一个算法所花费的时间与其中语句的执行次数成正比例算法中的基本操作的执行次数为算法的时间复杂度。分析算法复杂度步骤如下 找出算法的基本运算即主要的操作。估算出执行次数这通常与算法思想、问题规模和特定输入有关。 即找到某条基本语句与问题规模N之间的数学表达式就是算出了该算法的时间复杂度。 1.2 大O渐进表示法 大O符号Big O notation是用于描述函数渐进行为的数学符号用它可以表达一个算法运行时间的最小上界。 1.2.1 例子引入推导大O法 例下面fun函数的时间复杂度用大O法如何表示呢 void Func1(int N) {int count 0;for (int i 0; i N ; i){for (int j 0; j N ; j){count;}}for (int k 0; k 2 * N ; k){count;}int M 10;while (M--){count;} }首先我们得找到基本运算即自增操作而这三个自增操作执行次数如果要精确地算的话f(n) n2 2 * n 10。 实际中我们计算时间复杂度时我们其实并不一定要计算精确的执行次数而只需要大概执行次数那么这里我们使用大O的渐进表示法。先说结论fun函数的复杂度用大O法表示为O(n2)。 推导大O阶方法 用常数1取代运行时间中的所有加法常数。在修改后的运行次数函数中只保留最高阶项。如果最高阶项存在且不是1则去除与这个项目相乘的常数。 为什么要这样呢我们可以对fun函数往大的问题规模去对比 n 10F(N) 100 20 10n 100F(N) 10000 200 10n 1000F(N) 1000000 2000 10n 10000F(N) 100000000 20000 10 可以发现n越大直至当n趋于无穷剩下的 2 * n 10的次数已经不重要了去掉了这几项也不对结果造成影响。 另外有些算法的时间复杂度存在最好、平均和最坏情况 最坏情况任意输入规模的最大运行次数(上界)平均情况任意输入规模的期望运行次数最好情况任意输入规模的最小运行次数(下界) 例如在一个长度为N数组中搜索一个数据x 最好情况1次找到最坏情况N次找到平均情况N/2次找到 在实际中一般情况关注的是算法的最坏运行情况说一个算法的时间复杂度默认指的是最坏情况即这个算法我们不能保证它一直都是最好情况所以数组中搜索数据时间复杂度为O(N)。 1.2.2 举例 // 复杂度为O(n)其中M并不会随着输入而影响复杂度。 void Func2(int N) {int count 0;for (int k 0; k 2 * N ; k){count;}int M 10;while (M--){count;}printf(%d\n, count); }// 复杂度为O(NM) void Func3(int N, int M) {int count 0;for (int k 0; k M; k){count;}for (int k 0; k N ; k){count;}printf(%d\n, count); }这个复杂度也可以这么说当N远大于M时复杂度为O(N)反过来就是O(M)。 // 常数词O(1) void Func4(int N) {int count 0;for (int k 0; k 100; k){count;}printf(%d\n, count); }// 最坏O(n)不明白的话得你弄清楚strchr的功能从一个字符串查找某个字符 const char * strchr ( const char * str, int character );// 最坏执行了(N*(N1)/2次O(n^2) void BubbleSort(int* a, int n) {assert(a);for (size_t end n; end 0; --end){int exchange 0;for (size_t i 1; i end; i){if (a[i-1] a[i]){Swap(a[i-1], a[i]);exchange 1;}}if (exchange 0)break;} }// 最坏O(logn) int BinarySearch(int* a, int n, int x) {assert(a);int begin 0;int end n-1;// [begin, end]begin和end是左闭右闭区间因此有号while (begin end){int mid begin ((end-begin)1);if (a[mid] x)begin mid1;else if (a[mid] x)end mid-1;elsereturn mid;}return -1; }// 递归了N次O(n) long long Fac(size_t N) {if(0 N)return 1;return Fac(N-1)*N;// O(2^n)可以画递归树自己理解或者用递归方程求解 long long Fib(size_t N) {if(N 3)return 1;return Fib(N-1) Fib(N-2); }常见的复杂度如下 常数阶O(1)线性阶O(n)平方阶O(n2)对数阶O(logn)线性对数阶O(nlongn)立方阶O(n3)指数阶O(2n)。 注意对数阶是以2为底的log2n通常省略底数2。前六个复杂度属于多项式时间算法的渐进复杂度第七个属于指数时间算法的渐进复杂度其中还有阶乘阶O(n!)和O(nn)指数阶已经很离谱了后面这两种就更离谱了所以不常见。 1.3 空间复杂度 空间复杂度也是一个数学表达式是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间因为这个也没太大意义所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似也使用大O渐进表示法。 1.3.1 细分 程序运行所需的存储空间包括两部分 固定空间需求包括程序代码、常量、变量等 可变空间需求与程序处理的数据规模有关如1000大小的数组和10大小数组显然是不同的以及与算法执行所需的额外空间比如递归算法会需要栈空间不过要注意的是栈帧空间是可以复用的一旦上次函数递归调用结束栈内存空间就还给操作系统了下次递归调用再申请使用这块空间。 注意函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。如果要减少空间复杂度只能从可变空间这块下手。 1.3.2 举例 // 开辟了常数个额外空间因此空间复杂度为O(1)。 void BubbleSort(int* a, int n) {assert(a);for (size_t end n; end 0; --end){int exchange 0;for (size_t i 1; i end; i){if (a[i-1] a[i]){Swap(a[i-1], a[i]);exchange 1;}}if (exchange 0)break;} }只要这个程序的空间复杂度不会随着输入规模的增大而增大那么空间复杂度就是常数阶。 // 动态开辟了N个空间空间复杂度为 O(N)。 long long* Fibonacci(size_t n) {if(n0)return NULL;long long * fibArray (long long *)malloc((n1) * sizeof(long long));fibArray[0] 0;fibArray[1] 1;for (int i 2; i n ; i){fibArray[i] fibArray[i - 1] fibArray [i - 2];}return fibArray; }// 递归调用了N次开辟了N个栈帧每个栈帧使用了常数个空间空间复杂度为O(N)。 long long Fac(size_t N) {if(N 0)return 1;return Fac(N-1)*N; }2.什么是好的算法 一个好的算法应该具有以下特点 正确性。 算法的执行结果应当是解决某个问题的否则不叫算法最多称之为程序或是程序的正确性。程序健壮性与算法正确性有直接关系算法最终会被编写为程序而程序健壮性与算法正确性互补算法应当被正确地编写为健壮的程序。   对于大型系统指望算法“完全正确”是不可能的不过对于程序而言也许做不到完全正确但却可以要求程序是健壮的。当存在不合法的操作时程序能做出处理而不会引起严重后果。    正确的程序不一定是健壮的而健壮的程序不一定完全正确。一个程序应当能在正常的情况下运行也应当能在“异常”情况下运行并做出处理这是程序的可靠性。 简明性。 算法思想的逻辑清晰易于阅读和理解易于编码和调试。这个特性或许有些主观但简明性并不是可有可无的特性这是算法设计者应当争取的更容易理解的算法在编写为程序后也往往能减少更多的错误。不过遗憾的是简明的算法不一定高效这与算法的高效性有矛盾但不冲突可以结合两者做到算法的最优。 高效性。 指的是执行一个算法所需花费的时间是高效率的且有效地使用内存。当程序规模较大时设计算法经常会为了高的时间效率而占用更多的内存空间效率虽说随着计算机硬件高速发展现已太不关注内存的占用情况。但是如果为了高效的时间却会导致算法的可读性变差这并不是明智的选择。因此算法设计者应当考虑到算法的简明性和高效性做出折中办法。 最优性。 算法执行时间已经达到求解该问题所需时间的下界即没有比它更快的算法了最多持平。算法最优性与求解的问题复杂度有关如果一个算法在一个问题的最坏情况下任然能得到正确的结果那么可以认为这个算法是最优的。 3. 影响程序运行时间的因数 算法会被编写为程序所以程序运行时间与算法时间复杂度有着密切关系。 算法的好坏。 如果排除计算机系统和硬件情况这是根本和决定性因数。 问题的规模。 一般指输入的数据量比如对1000个数排序和1000000个数排序。 特定的输入数据。 例如从一个顺序表中查询指定输入的值这个值在顺序表中的位置很关键。如果刚好在第一个那么很快就能查到如果是最后一个的话那就是最坏情况了。 计算机系统和硬件。 对于影响程序运行是很好理解的但这个情况针对算法而言是不考虑的算法只考虑算法自身能不能做到最优而不是去要求更好的硬件。
http://www.dnsts.com.cn/news/193728.html

相关文章:

  • 个人做电商网站需要备案吗wordpress怎样对接dz
  • 北京大型网站优化网站开发顶岗周记
  • 手机网站建设教程视频安装网站程序
  • 爬取漫画数据做网站黄山自驾游旅游攻略
  • 网站开发设计流程家用电脑怎么做网站
  • wordpress清理网站缓存网站建设的功能需求分析
  • 网站运营小白可以做吗如何制作h5动态画面
  • 制作企业网站怎么做深圳南山网站建设公司
  • 赣州做网站哪家好广告联盟看广告赚钱
  • 行远金华网站建设公司页面设计包括哪些方面
  • 深圳网站设计与制作公司产品营销软文
  • 秦皇岛手机网站asp网站默认后台
  • 网站建设培训班南宁深圳市建设银行网站首页
  • 济南联通网站备案百度快照 网站描述 更新
  • 建设个人网站ip音乐视频怎么做mp3下载网站
  • 百度站长怎么验证网站s001网站建设公司
  • 如何创建个人网站模板中国十大it外包公司
  • 营销外贸网站建设案例cms网站开发实验报告
  • 揭阳新站seo方案音乐 wordpress
  • crm网站下载建购物的网站需要多少钱
  • 红孩子母婴网站开发背景昆明做百度网站电话号码
  • 关于做芯片类招聘的网站购物网站大全
  • emlog wordpress铁岭网站seo
  • 免费制作简历模板网站如何设置淘宝友情链接
  • 三 加强门户网站等新媒体建设icp备案号是什么意思
  • 个人网站建设流程图专业的集团网站设计网络
  • wordpress设置权限合肥seo网站管理
  • 网站推广在哪好外贸网站开发花费
  • 网站在建设时不容忽略的一些细节长春火车站到龙嘉机场动车时刻表
  • 个人网站备案转企业备案国外有哪些做deal的网站