数据结构:算法的初步认识

news2025/1/22 16:15:59

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

什么是算法

要求你写一个求 1+2+3+…+100 结果的程序,你应该怎么写呢?
大多数人会马上写出下面的C语言代码(或者其他语言的代码):

int a, sum- o, n= 100;
for (1 = 1; 1 <= n; i++) {
	sum = sumt + i;
}
printf("%d", sum);

18世纪生于德国小村庄的伟大数学家高斯给出的答案是:

用程序来实现如下:
int i, sum = O, n = 100; 
 sum = (1 + n ) * n / 2;
 printf("%d", sum);

为了解快某个或某类问题,需要把指令表示成一定的操作序列,操作序列包括一组操作,每一个操作都完成特定的功能,这就是算法了。(算法其实就是描述解决问题的方法。)

上面的的例子我们也看到,对于给定的问题,是可以有多种算法来解快的。
有没有通用的算法呢?有没有包治百病的药呀?现实世界中的问题千奇百怪,算法当然也就千变万化,没有通用的算法可以解决所有的问题。甚至解决一个小问题,很优秀的算法却不一定适合它。

算法的特性

算法具有五个基本特性:输人、输出、有穷性、确定性和可行性。

  • 输入
    算法具有零个或多个输入。大多数算法输入参数都是必要的,但对于个别情况,如打印hello world! 这样的代码,就不需要任何输入参数。
  • 输出
    算法至少有一个或多个输出。算法是一定需要输出的,不需要输出,你用这个算法干吗?输出的形式可以是打印输出,也可以是返回一个或多个值等。
  • 有穷性
    指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可按受的时间内完成。你写一个算法,计算机需要算上个二十年才会结束,它在数学意义上是有穷了,可是媳妇都熬成婆了,算法的意义也不就大了。
  • 确定性
    算法的每一步骤都具有确定的含义,不会出现二义性。相同的输入只能有唯一的输出结果。
  • 可行性
    算法的每一步都必须是可行的,都能够通过执行有限次数完成。可行性意味着算法可以转换为程序上机远行,并得到正确的结果。

算法设计的要求

算法不是唯一的,同一个问题,可以有多种解決问题的算法。尽管算法不唯一,相对好的算法还是存在的。

  • 正确性
    算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
  • 可读性
    算法设计的另一目的是为了便于阅读、理解和交流。
  • 健壮性
    当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。
  • 时间效率高和存储量低
    设计算法应该尽量满足时间效率高和存储量低的需求。人们都希望花最少的钱,用最短的时间,办最大的事,算法也是一样的思想,最好用最少的存储空间,花最少的时间,办成同样的事就是好的算法。

综上,好的算法,应该具有正确性、可读性、健壮性、高效率和低存储量的特征。

算法时间复杂度

在进行算法分析时,语句总的执行次数 T(n) 是关于问题规模 n 的函数,进而分析 T(n)n 的变化情况并确定 T(n) 的数量级。
算法的时间复杂度,也就是算法的时间量度,记作:T(n) = O(f(n))。它表示随问题规模 n 的增大,算法执行时间的增长率和 f(n) 的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中 f(n) 是问题规模 n 的某个函数。
这样用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。

推导大 O 阶:
  • 用常数1取代运行时间中的所有加法常数。
  • 在修改后的运行次数函数中,只保留最高阶项。
  • 如果最高阶项存在且不是1,则去除与这个项相乘的常数。

常见的时问复杂度

执行次数函数非正式术语
12O(1)常数阶
2n+3O( n n n)线性阶
3 n 2 n^{2} n2+2n+3O( n n n)平方阶
5 l o g 2 log_{2} log2n+20O(log n n n)对数阶
2n+3n l o g 2 log_{2} log2n+19O( n n nlog n n n)nlogn 阶
6 n 3 n^{3} n3+2 n 2 n^{2} n2+3n+4O( n 3 n^{3} n3)立方阶
2 n 2^{n} 2nO( 2 n 2^{n} 2n)指数阶

常用的时间复杂度所耗费的时间从小到大依次是:
O(1)<O(log n n n)<O( n n n)<O( n n nlog n n n)<O( n 2 n^{2} n2)<O( n 3 n^{3} n3)<O( 2 n 2^{n} 2n)<O( n n n!)<O( n n n^{n} nn)

对算法的分析,一种方法是计算所有情况的平均值,这种时间复杂度的计算方法 称为平均时间复杂度。另一种方法是计算最坏情况下的时间复杂度,这种方法称为最坏时间复杂度。一般在没有特殊说明的情况下,都是指最坏时间复杂度。

算法空间复杂度

我们在写代码时,完全可以用空间来换取时间,比如说,要判断某某年是不是闰年,你可能会花一点心思写了一个算法,而且由于是一个算法,也就意味着,每次给一个年份,都是要通过计算得到是否是闰年的结果。还有另一个办法就是,事先建立一个有2050个元素的数组(年数略比现实多一点),然后把所有的年份按下标的数字对应,如果是闰年,此数组项的值就是1,如果不是值为0。这样,所谓的判断某一年是否是闰年,就变成了查找这个数组的某一项的值是多少的问题。此时,我们的运算是最小化了,但是硬盘上或者内存中需要存储这2050个0和1。 这是通过一笔空间上的开销来换取计算时间的小技巧。

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作,空间复杂度为0(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

seata的AT模式

seata 分布式事务解决方案 官网 &#xff1a; seata.io 事务模式&#xff1a; 名词 TC &#xff1a; transaction coordinator 事务协调者 维护全局事务 和 分支事务的状态&#xff0c;驱动全局事务提交或者回滚TM &#xff1a; transaction manager 事务管理器 定义全局事…

(考研湖科大教书匠计算机网络)第一章概述-第三节:计算机网络的定义、功能分类

文章目录一&#xff1a;计算机网络的定义&#xff08;1&#xff09;最简单定义&#xff08;2&#xff09;较好定义二&#xff1a;计算机网络功能三&#xff1a;计算机网络的分类&#xff08;1&#xff09;按照“覆盖范围”分类&#xff08;2&#xff09;按照“使用者”分类&…

【Linux学习】进程控制

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 在前面&#xff0c;我们学习了进程的相关概念&#xff0c;在这里本喵会给大家介绍如何控制进程。…

私人影院微信小程序源码,采用腾讯小程序云开发,包括影院动态,最新影讯,房间预约,后台预约管理,导出预约表格Excel数据等功能

功能介绍 私人影院是很多年轻人比较喜欢的地方&#xff0c;虽然空间小&#xff0c;但是他们喜欢在这样的空间里享受休闲的时光&#xff0c;通过提前预约订位&#xff0c;可以使商家和消费者节省时间&#xff0c;减少人力成本&#xff0c;大大方便业务的拓展&#xff0c;同时也…

Word控件Spire.Doc 【Table】教程(4):如何在C#、VB.NET中设置Word表格样式

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

备战蓝桥杯数学基础:位运算理论

[TOC](目录)位运算概述位运算就是基于整数的二进制表示进行的运算&#xff0c;由于计算机内部就是以二进制来村塾数据&#xff0c;位运算是相当快的。基本的位运算共6种&#xff0c;分别为按位与、按位或、按位异或、按位取反、左移和右移与、或、异或这三者都是两数间的运算&a…

【算法刷题】栈与队列题型及方法归纳

栈与队列的特点 1、栈&#xff1a;FIFO 栈是仅能对其一端进行操作的结构&#xff0c;实现后进先出的效果。在C中采用容器适配器的方式实现栈。&#xff08;容器适配器实际上就是对某一类型的对象进行泛化&#xff0c;定义了这一类泛化对象的可进行操作的逻辑&#xff09; 什么…

上半年要写的博客文章22

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

极端尺度物体的显著性分割方法(SOD 新 SOTA)

Paper Link&#xff1a;http://cvteam.buaa.edu.cn/papers.htmlBackground&#xff1a;显著性物体分割在常规图像场景取得突破进展&#xff0c;在极端尺度物体场景仍面临挑战。图像前景物体分割是深度学习、计算机视觉等领域的研究热点&#xff0c;在机器视觉、智能交通、智慧医…

Mac 电脑磁盘空间释放记录

起因 点开钉钉页面就卡住&#xff0c;看了一下&#xff0c;光一个钉钉占到4G左右的内存&#xff0c;给钉钉发了工单&#xff0c;没人理我。又随手看了一下系统磁盘空间使用情况&#xff0c;发现快满了&#xff01;&#x1f613; 应用清单 我是一个应用的超轻度用户&#xff…

NFT市场聚合器:他们有没有得到广泛使用?他们对于冷门的NFT交易市场有什么影响?

聚合器是什么&#xff1f;NFT市场聚合器是一种交易工具平台&#xff0c;允许用户在一个页面同时间从多个不同的市场浏览和发现NFT。 这些聚合器将市场上的NFT挂单整合在一起&#xff0c;使用户更容易找到并购买NFT&#xff0c;并节省了用户在多个不同NFT市场之间比较来回比较NF…

rabbitMQ简介

rabbitMQ简介 目前应用最广泛的一个基于AMQP规范的开源的消息中间件RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现 rabbitMQ的重要概念 Message&#xff1a;消息&#xff0c;消息是没有名称的&#xff0c;消息由消息头和消息体组成&#xf…

腾讯安全联合Gartner发布SOC+白皮书,助力政企构筑实战化安全运营体系

随着数字化浪潮的蓬勃兴起&#xff0c;各类政企机构上云步伐加快。与此同时&#xff0c;如高危漏洞、勒索病毒、挖矿木马、APT攻击等威胁层出不穷&#xff0c;安全形势日益严峻。许多政企机构虽部署了较为完备的基础安全产品&#xff0c;但防御体系仍以异构设备堆叠式为主&…

STM32+ESP8266+机智云+DHT11数据上传

机智云 文章目录机智云前言一、工程的修改二、数据的上传1.标识符2.数据处理3.数据上传三、app控制前言 今天搞了一下机智云&#xff0c;就想把温湿度发到app上去&#xff0c;然后能够控制灯的开关。之前从来没有用过这个玩意&#xff0c;用阿里云和点灯科技多一点&#xff0c…

恭喜 OpenSergo 获得中国开源云联盟 2022 “优秀开源项目”

作者&#xff1a;OpenSergo 为了营造良好的开源氛围&#xff0c;为我国开源产业发展注入更多活力&#xff0c;中国开源云联盟(China Open Source Cloud League&#xff0c;简称“COSCL”) 组织开展了 2022 年度评选活动。并在今天的 2022 木兰峰会中公布了评选结果。 2022 木兰…

共享模型之管程(六)

1.park&unpark 1.1.概述 1>.他们是LockSupport类中的方法 // 暂停当前线程 LockSupport.park(); // 恢复某个线程的运行 LockSupport.unpark(暂停线程对象)注意:先park再unpark! 1.2.案例 Slf4j public class TestPark {public static void main(String[] args) th…

持续数据保护(CDP)适合档案数据备份吗?

几个月前笔者写过两篇针对档案长期保存库备份&#xff08;或者说是档案数字资源长期保存策略&#xff09;的文章&#xff0c;《电子档案备份相对于数据备份的特别之处》、《备份策略从“3-2-1”到“4-3-2-1”》&#xff0c;但是很多读者依然觉得不解渴&#xff0c;因为目前绝大…

Activity和Fragment的生命周期总结以及保存实例状态机制

读完将收获以下内容 一. Activity的生命周期详解 Activity配置和状态改变时生命周期 Activity状态和配置改变时的解决方案 二.Fragment的生命周期详解 Fragment配置和状态改变时生命周期 Fragmen状态和配置改变时的解决方案 三.Activity和Fragment的生命周期调用顺序 一. Acti…

笔记--Qt Pro语法总结

QT pro文件&#xff1a; 任何一个 Qt 项目都至少包含一个 pro 文件&#xff0c;此文件负责存储与当前项目有关的配置信息&#xff0c;比如&#xff1a; 项目中用到了哪些模块&#xff1f; 项目中包含哪些源文件&#xff0c;哪些头文件&#xff0c;它们的存储路径是什么&…

德育知识元素挖掘系统设计 软件工程 spring boot + Vue.js + python机器学习

第一章 绪论 摘要 当今社会发展迅速&#xff0c;机器学习相关技术快速在各行各业普及&#xff0c;制作数据挖掘系统的需求日益增长。同时&#xff0c;随着社会发展不断推进&#xff0c;对学生进行德育教育的规模越做越大&#xff0c;成为了教育行业发展的一大趋势。对于较大规模…