今天写了trapping rain water,
发现了,有了一些储备的数学知识,很多问题会更容易抽象,也更容易找到解决办法。比如解决trw时的抽象出的极值观点。
发现了,算法是一点一点勾勒出来的,把问题一步步抽象,一步步解决。
知道了算法的时空复杂度的概念,对算法这个概念也有了更深的理解。
具体的,在写trw时,写出了一个找一个数组中的极大值的函数,求两个极大值之间的存水量的函数,以及一组数求和函数。
附件:知识点们
复杂度 complexity
时间复杂度:一个算法执行耗费的时间(语句执行的次数)关于问题规模n的函数(仅考虑函数类型)
最坏时间复杂度,平均时间复杂度,
时间复杂度与具体参数有关(语句执行次数)
时间复杂度可用于评价算法性能(运行时间长短)(规模n不同时)
1(常数,但不一定小,只是不随规模变化),n,对数,线性对数,平方,立方,2指数
分别对应普通代码,二分,循环,分治,双层循环,三层循环,穷举查找
空间复杂度:
运行完一个程序需要的存储空间的大小。包括固定部分(指令空间,数据空间(常量和简单变量))和可变部分(动态分配的空间,递归栈所需的空间:为局部变量分配的空间,包括函数的形参变量和代码块内部变量;)。可变部分和算法有关。算法的复杂度指的是算法占用的空间和规模n的关系
一个c或c++编译的程序占用的内存分为:
栈区stack:由编译器自动分配或释放,用于存储局部变量和函数参数值。分配时的操作方式类似数据结构栈
堆区heap:由程序员通过调用malloc分配和释放,或者程序结束时由OS回收。不同于数据结构中的堆,分配方式类似于数据结构中的链表。
全局区static:静态数据存储空间,存储全局变量和静态变量。初始化的和未初始化的全局变量和静变量在两块相邻的区域里存放。程序结束后由系统释放。
文字常量区:存放常量字符串。程序结束后由系统释放
程序代码区:存放函数体的二进制代码
堆栈一方面是两种属于抽象数据类型的数据结构。堆满足一定限制的限制结构,栈中元素有先进后出顺序的线性结构
(抽象数据类型:自定义的数据类型,有操作范围,有处理函数)
另一方面,堆栈是两种类型的存储区。特点见上。
同时,堆栈又单指栈。
算法的时空复杂度会相互影响,不可兼得。类似的,算法的所有性能之间也存在相互影响,要综合考虑包括使用频率,处理数据量的大小,所描述语言的特性,运行机器的系统环境等各方面的因素。