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

网站如何做市场推广爱用建站

网站如何做市场推广,爱用建站,做网站设计的,青岛网络公司老板是谁这里写目录标题 1. 算法复杂度2. 时间复杂度2.1 执行次数2.2 大O渐进表示法2.3 常见时间复杂度计算eg1eg2eg3eg4eg5eg6eg7eg8eg9 3. 空间复杂度eg1eg2eg3eg4 4. 常见复杂度对比5. 复杂度练习eg1 1. 算法复杂度 衡量一个算法的好坏,一般是从时间空间两个维度来衡量&…

这里写目录标题

  • 1. 算法复杂度
  • 2. 时间复杂度
    • 2.1 执行次数
    • 2.2 大O渐进表示法
    • 2.3 常见时间复杂度计算
      • eg1
      • eg2
      • eg3
      • eg4
      • eg5
      • eg6
      • eg7
      • eg8
      • eg9
  • 3. 空间复杂度
      • eg1
      • eg2
      • eg3
      • eg4
  • 4. 常见复杂度对比
  • 5. 复杂度练习
    • eg1

1. 算法复杂度

衡量一个算法的好坏,一般是从时间空间两个维度来衡量,即时间复杂度和空间复杂度。
时间复杂度衡量算法的运行快慢,空间复杂度衡量算法运行所需要的额外空间。

2. 时间复杂度

算法的时间复杂度是一个函数,定量描述了该算法的运行时间。
算法花费的时间与其中语句的执行次数成正比,算法中的基本操作的执行次数,为算法的时间复杂度。

2.1 执行次数

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;}printf("%d\n", count);
}

Func1 执行的基本操作次数 :F(N)=N^2+2*N+10
实际计算时间复杂度时,不一定要计算精确,只需要大概执行次数,使用大O的渐进表示法O(N^2)

2.2 大O渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:

  1. 用常数 1 取代运行时间中的所有加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

另外有些算法的时间复杂度存在最好、平均和最坏情况:

  1. 最坏情况:任意输入规模的最大运行次数(上界)
  2. 平均情况:任意输入规模的期望运行次数
  3. 最好情况:任意输入规模的最小运行次数(下界)

2.3 常见时间复杂度计算

eg1

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

F(N)=2N+10 --> O(N)

eg2

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

F(N)=M+N --> O(M+N)

eg3

void Func4(int N){int count = 0;for (int k = 0; k < 100; ++ k){++count;}printf("%d\n", count);
}

F(N)=100 --> O(1)

eg4

// 计算strchr的时间复杂度
const char * strchr ( const char * str, int character );

strchr函数用于在给定字符串str中查找字符character首次出现的位置。如果找到,返回指向该字符的指针;如果未找到,返回NULL
最好情况:1;最坏情况:O(N)

eg5

// 计算BubbleSort的时间复杂度
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(N);最坏情况:O(N^2)

eg6

// 计算BinarySearch的时间复杂度
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);//((end - begin) >> 1) 相当于 (end - begin) / 2//这样写可以避免 (begin + end) / 2 可能导致的溢出问题(当 begin 和 end 很大时)if (a[mid] < x)//如果中间位置的值 a[mid] 小于要查找的值 x,说明 x 在 mid 的右侧,所以将 begin 更新为 mid + 1begin = mid + 1;else if (a[mid] > x)//如果中间位置的值 a[mid] 大于要查找的值 x,说明 x 在 mid 的左侧,所以将 end 更新为 mid - 1end = mid - 1;else//如果 a[mid] 等于 x,说明找到了目标值,直接返回 mid,即目标值在数组中的下标return mid;}return -1;
}

eg7

// 计算阶乘递归Fac的时间复杂度
long long Fac(size_t N){  if(0 == N)  return 1;  return Fac(N-1)*N;  
}

对于输入为N时,函数会进行N次递归调用,每次递归调用除了递归自身外其他操作时间近似为常数,所以整体时间复杂度与输入规模N成线性关系,即O(N)

eg8

// 计算斐波那契递归Fib的时间复杂度
long long Fib(size_t N){  if(N < 3)  return 1;  return Fib(N-1) + Fib(N-2);  
}

每次递归调用都会产生两个新的递归调用,随着N的增大,计算量呈指数增长。
计算Fib(N)时,需要计算Fib(N - 1)Fib(N - 2),而计算Fib(N - 1)又需要计算Fib(N - 2)Fib(N - 3)等等,存在大量的重复计算,导致计算量迅速膨胀。O(2^N)

eg9

消失的数字
数组nums包含从0n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例:

  • 输入:[9,6,4,2,3,5,7,0,1]
  • 输出:8

分析:

  1. 先排序,再查找,n的下一个数字不是n+1,则n+1为缺失数字
    N*logN+N -->O(N*logN)
  2. 异或 (同0异1)(aba=b)
    O(2N)–>O(N)
int missingNumber(int* nums, int numsSize) {int x = 0;for (int i = 0; i < numsSize; ++i) {x ^= nums[i];}for (int i = 0; i < numsSize + 1; ++i) {x ^= i;}return x;
}
  1. 用0~N的等差数列公式计算数组之和,减数组中的值
    O(N)
int missingNumber(int* nums, int numsSize) {int x = (1 + numsSize) * numsSize / 2;for (size_t i = 0; i < numsSize; ++i) {x -= nums[i];}return x;
}

3. 空间复杂度

空间复杂度是一个数学表达式,对算法在运行过程中临时占用额外存储空间大小的量度 。
空间复杂度不是程序占用了多少bytes的空间,算的是变量的个数,使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

eg1

// 计算BubbleSort的空间复杂度
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 (1) ,因为除了输入数组本身外,额外使用的空间不随输入规模增长

eg2

// 计算Fibonacci的空间复杂度
// 返回斐波那契数列的前n项
long long* Fibonacci(size_t n){if (n == 0)return NULL;long long* fibArray = (long long*)malloc((n + 1) * 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;
}

空间复杂度是 O (n),因为它分配了一个大小为n + 1的数组来存储斐波那契数列的前n项,空间使用量与输入的n成正比。

eg3

// 计算阶乘递归Fac的空间复杂度
long long Fac(size_t N){if (N == 0)return 1;return Fac(N - 1) * N;
}

每次递归调用都会在栈上创建一个新的栈帧。在最坏情况下,会递归 N 次,所以空间复杂度是 O(N)。因为递归调用栈的深度最大为 N,需要 O(N) 的栈空间来存储每一层递归调用的状态。

eg4

// 计算斐波那契递归Fib的空间复杂度  
long long Fib(size_t N){  if(N < 3)  return 1;  return Fib(N-1) + Fib(N-2);  
}

O(N),深入建立栈帧,函数结束销毁栈帧,再建立栈帧还是在该空间建立,所以一共建立N个栈帧,Fib(N-1) + Fib(N-2);使用的是同一块栈帧

4. 常见复杂度对比

表达式大 O 表示法时间复杂度类别
12345O(1)常数阶
3n + 4O(n)线性阶
3n² + 4n + 5O(n²)平方阶
3log(2)n + 4O(logn)对数阶
2n + 3nlog(2)n + 14O(nlogn)nlogn 阶
n³ + 2n² + 4n + 6O(n³)立方阶
2ⁿO(2ⁿ)指数阶

请添加图片描述

5. 复杂度练习

eg1

轮转数组
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

  1. 暴力求解,旋转k次
    时间复杂度:k=n-1,kn–> O(N^2)
    空间复杂度:O(1)
  2. 三段逆置
    4 3 2 1 5 6 7 前n-k逆置
    4 3 2 1 7 6 5 后k 逆置
    5 6 7 1 2 3 4 整体逆置
    时间复杂度:O(N)
    空间复杂度:O(1)
void reverse(int* a, int left, int right) {while (left < right) {int tmp = a[left];a[left] = a[right];a[right] = tmp;++left;--right;}
}
void rotate(int* nums, int numsSize, int k) {if (k > numsSize)k %= numsSize;reverse(nums, 0, numsSize - k - 1);reverse(nums, numsSize - k, numsSize - 1);reverse(nums, 0, numsSize - 1);
}
  1. 空间换时间
    将前后拷贝至tmp,再拷贝到a
    a=[1 2 3 4 5 6 7]
    tmp=[5 6 7 1 2 3 4]
    时间复杂度:O(N)
    空间复杂度:O(N)
void rotate(int* nums, int numsSize, int k) {if (k > numsSize)k %= numsSize;int* tmp = (int*)malloc(sizeof(int) * numsSize);memcpy(tmp + k, nums, sizeof(int) * (numsSize - k));memcpy(tmp, nums + numsSize - k, sizeof(int) * (k));memcpy(nums, tmp, sizeof(int) * (numsSize));free(tmp);
}

文章转载自:

http://hzPzeeCb.bwjgb.cn
http://21jmdMft.bwjgb.cn
http://tfKUKaXg.bwjgb.cn
http://WNA0DfIV.bwjgb.cn
http://MMCU7TRc.bwjgb.cn
http://tV2SnDRO.bwjgb.cn
http://lZoJEv4C.bwjgb.cn
http://Ip564nkI.bwjgb.cn
http://yzUJ9Nd8.bwjgb.cn
http://DVgiwSF8.bwjgb.cn
http://UiL02mp5.bwjgb.cn
http://OyE8FqAg.bwjgb.cn
http://GCuJFsRa.bwjgb.cn
http://GjC9ruOn.bwjgb.cn
http://w07OuQif.bwjgb.cn
http://nCWZKL6W.bwjgb.cn
http://pWC6Eeh0.bwjgb.cn
http://4Y3P0gzk.bwjgb.cn
http://f0y7IwnJ.bwjgb.cn
http://wNgN13mI.bwjgb.cn
http://mrik6VPH.bwjgb.cn
http://qY1ajp3l.bwjgb.cn
http://UdBBUTFb.bwjgb.cn
http://kCwpCvU6.bwjgb.cn
http://oJ9pJ0pW.bwjgb.cn
http://pFFrZaij.bwjgb.cn
http://A2d9SULu.bwjgb.cn
http://falzerKN.bwjgb.cn
http://4DKURcnU.bwjgb.cn
http://UJ1hNq4T.bwjgb.cn
http://www.dtcms.com/wzjs/684388.html

相关文章:

  • 怎样做网站全屏代码电商培训班主要学什么
  • 网站开发简称微信运营包括哪些内容
  • 做网站必须开厂吗阿里云上怎么做网页网站
  • 济南市工程建设技术监督局网站邢台做网站备案
  • 深圳网站建设团队网址转换成短链接
  • iis7如何部署网站建立网站需要钱吗
  • 个人网站怎么快速推广创建免费网页
  • 南宁网站建设教学帮企网站建设
  • 装修设计案例网站可以在线做动图的网站
  • 北京建网站公司wordpress链接提交表单
  • 国办网站建设要求品牌策划案模板
  • 做电商搜素材网站都是什么changer网站建设
  • 用别人的公司名字做网站义乌网站设计
  • 做淘宝网站销售怎么样网上做衣服的网站
  • 怎么做企业官方网站谷歌官网登录入口
  • .net网站 作品工资8000以上的工作
  • 企业网站开发北京世界比赛排名
  • 丝绸之路网站建设策划书沈阳做网站哪好
  • 注册网站时审核是人工审核吗还是电脑审核深圳做网站龙华信科
  • seo搜索引擎招聘长春seo外包
  • 内蒙网站建设赫伟创意星空科技常州网站建设公司信息
  • 网站定制案例新风格网站
  • 临汾网站建设抚州seo
  • 怎么创网站赚钱吗免费的网页入口
  • 保定外贸网站建设旅游网站怎么建设
  • 做网站的公司怎样收费外贸网站建站电话多少
  • 网站类型定位莱州网站建设包年多少钱
  • 合肥官方网站建设政务网站模板
  • 网站推广的软文网站建设项目组织图
  • 网站开发与编程的区别微信开发者文档下载