前言
身为一个开发人员,越纵向发展就越会发现算法的重要性,所以我决定重拾大学知识,从C开始学起,一点点夯实自己的算法技术,我会慢慢更新自己的文章,也希望自己可以坚持学习。如有不对之处,欢迎指正。
数据结构—基本数据单位
下面由一张图引出数据的基本概念,以及它们自己的关系。
数据: 程序的操作对象,用于描述客观事物.
数据对象: 性质相同的数据元素的集合(类似于数组)
数据元素: 组成数据的对象的基本单位
数据项: 一个数据元素由若干数据项组成
数据结构
那么什么是数据结构呢?数据结构, 数据元素之间不是独立的,存在特定的关系.这些关系即是结构;指的数据对象中的数据元素之间的关系。
其中结构有分为逻辑结构和物理结构,逻辑结构分为集合结构,线性结构,树形结构,图形结构;物理结构分为顺序存储结构和链式存储结构,下面以图形的形式列出各种结构的特点:
算法
算法(algorithm)是解决特定问题求解步骤的描述,在计算机中表现为有限的操作序列。在数据类型建立起来之后,就要对这些数据类型进行操作,建立起运算的集合即程序。运算的建立、方法好坏直接决定着计算机程序原型效率的高低。
数据结构与算法的关系
两者基友联系又有区别。联系是程序=算法+数据结构。数据结构是算法实现的基础,算法总是要依赖某种数据结构来实现的。算法的操作对象是数据结构。区别是数据结构关注的是数据的逻辑结构、存储结构有一集基本操作,而算法更多的是关注如何在数据结构的基本上解决实际问题。算法是编程思想,数据结构则是这些思想的基础,如图所示
时间复杂度
时间复杂度,又称时间复杂性,算法的时间复杂度是一个函数,可以称之为大O表示法。他有一下规则:
1. 用常数1取代运行时间中所有常数 3->1 O(1)
2. 在修改运行次数函数中,只保留最高阶项 n^3+2n^2+5 -> O(n^3)
3. 如果在最高阶存在且不等于1,则去除这个项目相乘的常数 2n^3 -> n^3
它定性描述该算法的运行时间,算法的时间复杂度是衡量一个算法好坏的重要指标。一般情况下,随着规模n的增大,次数T(n)的增长较慢的算法为最优算法。常见时间复杂度从小到大依次排列:O(1) < O(logn) < O(n)< O(nlogn) < O(n²)<O(n³) < O(2^n) <O(n!) < O(n^n)
时间复杂度术语:1. 常数阶 2. 线性阶 3. 平方阶 4. 对数阶 5. 立方阶 6. nlog阶 7. 指数阶(不考虑) O(2^n)或者O(n!) 除非是非常小的n,否则会造成噩梦般的时间消耗. 这是一种不切实际的算法时间复杂度. 一般不考虑!
空间复杂度
空间复杂度(space complexity)作为算法所需存储空间的量度,记做S(n) = O (f(n))。其中,n为问题的规模;f(n)为语句关于n的所占存储空间的函数。 对于一个算法,所有的变量、指令、结果都需要存储空间,另外在算法的执行过程中,临时变量和临时结果也需要保留下来以便下一步计算,这些称为算法执行时的辅助空间。
空间复杂度主要定性描述算法所需的辅助空间。
对一个算法,其时间复杂度和空间复杂度往往会互相影响. 当追求一个较好的时间空间复杂度时,可能会导致占用较多的存储空间. 即可能会使用空间复杂度的性能变差.反之亦然. 不过,通常情况下,鉴于运算空间较为充足,人们都以算法时间空间复杂度作为算法优先的衡量指标。
网友评论