计算机辅助教育---算法与数据结构
Posted 一张图啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机辅助教育---算法与数据结构相关的知识,希望对你有一定的参考价值。
写在前面
可能有些人会吐槽,学算法有什么用,顶多就是去面试大厂的时候能用上,大厂面试算法也只是强中筛强的一个敲门砖而已,我又不去面大厂,不用学它,真的是这样吗?
肯定不是,在计算机行业发展,不管是前端亦或是后端,算法都是进阶的一个绊脚石,可以说不会算法永远也成不了一个合格的高级工程师,想要进大厂确实要会些算法,但是它并不只是为了面试,它和我们的程序是息息相关的。
什么是数据结构
数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。
数据结构是为算法服务的,算法是要作用再特定的数据结构上的。
最常用的数据结构预算法:
数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Tire树
算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
在许多程序设计当中,数据结构的选择是一个基本的设计考虑因素,系统实现的困难程度和系统构造的质量都严重依赖于是否选择了最优的数据结构,选择最优的数据结构能够有效的提高运行的效率和节约存储空间的使用,但是要知道,没有十全十美的数据结构,每种数据结构都有局限性同样也有优点,要根据需求来选择合适的数据结构
什么是复杂度分析法则
1)单段代码看高频:比如循环。
2)多段代码取最大:比如一段代码中有单循环和多重循环,那么取多重循环的复杂度。
3)嵌套代码求乘积:比如递归、多重循环等
4)多个规模求加法:比如方法有两个参数控制两个循环的次数,那么这时就取二者复杂度相加
-
时间维度:指执行代码所消耗的时间,即时间复杂度 -
空间维度:指执行代码所消耗的空间,即空间复杂度
接下来就开始逐步剖析时间和空间复杂度了,先说时间复杂度
时间复杂度
在说时间复杂度之前,我们首先要理解一个概念即代码执行次数,也可称之为语句频度或时间频度,用 T(n)
表示
我们用例子来一步一步阐述,首先我们来看函数
时间复杂度分析
只关注循环执行次数最多的一段代码
加法法则:总复杂度等于量级最大的那段代码的复杂度
乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
几种常见时间复杂度实例分析
多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括,
O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n^2)(平方阶)、O(n^3)(立方阶)
非多项式阶:随着数据规模的增长,算法的执行时间和空间占用暴增,这类算法性能极差。包括,
O(2^n)(指数阶)、O(n!)(阶乘阶)
fn1
function fn1(){
console.log("句末")
console.log("isboyjc")
}
我们来看这个函数中的语句会执行多少次
很明显此函数内部只有两个语句,即 console.log("句末")
和 console.log("isboyjc")
,那么我们说这个函数体内代码执行次数是 2
我们再来看函数 fn2
int cal(int m, int n) {
int sum_1=0;
int i=1;
for(;i<m;++i){
sum_1 = sum_1 + i;
}
int sum_2 = 0;
int j=1;
for (;j<n;++j){
sum_2 = sum_2 + j;
}
return sum_1 + sum_2;
}
「结论:」
T(n)
为常数时,时间复杂度为O(1)
,反之时间复杂度为O(保留T(n)的最高次项并去掉最高次项的系数)
接下来,我们看几个例子来判断下几段代码的时间复杂度
「例1:」
function fn01(){
console.log("你看这是啥")
console.log("这是一个输出")
console.log("哈哈哈")
let a = 1
return a
}上面这个函数
fn01
中只有一条条的语句,共执行 5 次,毫无变化,时间复杂度即O(1)
,此为常数级时间复杂度「例2:」
function fn02(n){
for(let i = 0; i < n; i++){
console.log("这是一个输出以上是关于计算机辅助教育---算法与数据结构的主要内容,如果未能解决你的问题,请参考以下文章