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

简单介绍算法的基本概念

算法的基本概念

计算机所进行的一切操作都是由程序决定的,程序是由人们事先编好并输入计算机的。

一个程序包括以下两方面的内容:

  • 数据的描述:在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式,即数据结构

  • 操作的描述:对数据进行操作的方法和步骤的描述,也就是算法,算法用于解决“做什么”和“怎么做”的问题。

数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。著名的计算机科学家沃思曾提出一个公式:

算法+数据结构=程序

算法是程序的核心

算法具有以下特性:

  • 输入:在算法中可以有零个或者多个输入
  • 输出:在算法中至少有一个输出。由于算法需要给出解决特定问题的结果,没有输出的算法是毫无意义的
  • 有穷性:任意一个算法在执行有穷个计算步骤后必须终止
  • 确定性:算法的每一个步骤必须具有确切的定义,不能有二义性
  • 可行性:算法的每一步都必须是可行的

算法复杂度的概念和意义

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适的算法。对一个算法的评价主要从时间复杂度和空间复杂度来考虑,这也是提升应用程序质量的落脚点。

算法的时间复杂度

时间频度

一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比,算法中哪个语句执行次数多,它花费的时间就多。一个算法中的语句执行次数称为语句频度或时间频度

时间复杂度

在刚才提到的时间频度中,n为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引人时间复杂度概念。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐近时间复杂度,简称时间复杂度。

在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为(1)。另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1,它们的频度不同,但时间复杂度相同,都为 O(n2)。随着问题规模n和时间复杂度不断增大,算法的执行效率随之降低。

常见的算法时间复杂度由小到大依次为:

O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<…<O(2n)<O(n!)

算法的空间复杂度

与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量

算法执行期间所需要的存储空间包括3个部分:

  • 算法程序所占的空间。
  • 输入的初始数据所占的存储空间。
  • 算法执行过程中所需要的额外空间。

在许多实际问题中,为了减少算法所占的存储空间,通常采用压缩存储技术


http://www.kler.cn/news/234453.html

相关文章:

  • LeetCode Python -8.字符串转整数
  • golang 集成sentry:PostgreSQL
  • 4核8g服务器能支持多少人访问?- 腾讯云
  • 【Rust】——猜数游戏
  • python打印等边三角形
  • 【0257】关于pg内核shared cache invalidation messages (概念篇)
  • 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • 私有化部署一个自己的网盘
  • 【超高效!保护隐私的新方法】针对图像到图像(l2l)生成模型遗忘学习:超高效且不需要重新训练就能从生成模型中移除特定数据
  • 2024 年 5 款适用于免费 iPhone 数据恢复的工具软件
  • 【从Python基础到深度学习】1. Python PyCharm安装及激活
  • AR人脸106240点位检测解决方案
  • 《CSS 简易速速上手小册》第1章:CSS 基础入门(2024 最新版)
  • 问题:老年人心理健康维护与促进的原则为________、________、发展原则。 #媒体#知识分享
  • Python算法题集_随机链表的复制
  • fast.ai 机器学习笔记(一)
  • 信号的状态类型
  • Unity引擎学习笔记之【动画层操作】
  • 突破编程_C++_基础教程(继承与多态)
  • EasyExcel的导入导出使用
  • Open CASCADE学习|扫掠
  • STM32 与 ARM 的联系
  • 面试 JavaScript 框架八股文十问十答第九期
  • IAR报错解决:Fatal Error[Pe1696]: cannot open source file “zcl_ha.h“
  • 数据备份和恢复
  • K8S系列文章之 [基于 Alpine 使用 kubeadm 搭建 k8s]
  • AES加密中的CBC和ECB
  • 【开源】SpringBoot框架开发大病保险管理系统
  • unity实现第一人称和第三人称