算法导论

简介: 算法导论

一.算法

  非形式地说,算法【algorithm】就是任何定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。这样算法就是把输入转换成输出的计算步骤的一个序列。

  我们也可以把算法看成是用于求解计算问题的工具。一般来说,问题陈述说明了期望的输入/输出关系。算法则描述一个特定的计算过程来实现该输入/输出关系。例如,我们可能需要把一个数列进行升序排序。实际上,这个问题经常出现,并且为引入许多标准的设计技术和分析工具提供了足够的理由。

  输入:n个数的一个序列(a1,a2,...,an)

  输出:输入序列的一个排序(a`1,a`2,...,a`n)

  例如,给定输入序列(6,3,1,2,8,5),排序算法将返回序列(1,2,3,5,6,8)作为输出。这样的输入序列称为排序问题的一个实例。一般来说,问题实例由计算该问题解所必需的【满足问题陈述中的各种约束】输入组成。

  因为许多程序使用排序作为中间步骤,所以排序是计算机科学中的一个基本操作。因此,已有许多好的排序算法供我们任意使用。对于给定应用,哪个算法最好依赖于一下因素:将要被排序的项数、这些项已被稍微排序的程度、关于项值的可能限制、计算机的体系结构、以及使用的存储设备的种类【内存、磁盘或磁带】。

  若对每个输入实例算法都以正确的输出结束,则称该算法是正确的,并称正确的算法解决了给定的计算问题。不正确的算法对某些输入实例可能根本不停止,也可能以不正确的方式结束。与人们期望的相反,不正确的算法只要其错误率是可控的,有时还是有用的。例如:在研究大素数算法时,将会是一个具有可控错误率的算法。

  算法可以用英文说明,也可以说明成计算机程序,甚至说明成硬件设计。唯一的要求是这个说明必须准确描述所要遵循的计算过程。

二.算法解决那些问题

  排序绝不是已开发算法的唯一计算问题,实际上,算法的实际应用是无处不在的,例如:

  1.人类基因工程

    识别人类DNA中所有10万个基因,确定构成人类DNA的30亿个化学基对的序列。

  2.互联网搜索

    互联网使得全世界的人都能快速地访问与检索大量信息。借助于一些聪明的算法,互联网上的网站能够管理和处理这些海量数据。

  3.电子商务

    电子商务使得货物能够以电子方式洽谈与交换,并且依赖于信用卡号、密码和银行结单这类个人信息的保密性。

  4.制造业、广告推送等等

  5.A/B两点的最短路径

  6.最长公共子序列

  7.工厂流水线设计等等

  虽然这些问题的列表还未穷尽,但是它们却展示了许多有趣的算法问题所共有的两个特征:

    1.存在许多候选解,但绝大多数候选解都没有解决手头上的问题。寻找一个真正的解或一个最好的解可能是一个很大的挑战。

    2.存在实际应用。例如,最短路径问题就是一个很常见的例子。地图导航、货物运输、网络路由等等

三.数据结构

  数据结构是一种存储和组织数据的方式,旨在便于访问和修改。没有一种单一的数据结构对所有用途都有效,所有重要的是知道不同数据结构的优点和局限。

四.技术

  虽然你可能掌握了很多的算法,但是也许某一天你会遇到这样一个问题,你一时无法找到一个你所知晓或搜索到的算法来解决它。那么你需要知道如何自己设计与分析一个算法,并且可以去证明及测试它的效率。

五.并行性

  我们或许可以指望处理器时钟速度能以某个持续的比率增加多年。然而物理的限制对不断提高的时钟速度给出了一个限制:因为功率密度随着时钟速度超线性增长,一旦时钟速度变的足够快,芯片就有融化的危险。因此,为了每秒执行更多的计算,芯片被设计成包含不止一个核心,不同核心之间可以并行执行。因此,为了算法从多核计算机中获得最佳性能,设计算法时必须考虑并行性。

六.算法无处不在

  我们应该像计算机硬件一样把算法看成一种技术。整个系统的性能不但依赖于选择快速的硬件而且还依赖于选择有效的算法。可能你会想,我只是开发一个简单的WEB程序,只有html和css,那么抱歉,其中还是设计了不少算法,其中,图形界面的渲染依赖了算法,WEB程序依赖互联网,网络中的路由高度依赖路由算法。程序需要中有需要编译的代码没?编译器也广泛使用算法。因此,算法时当前计算机中使用的大多数计算的核心。

  进一步说,随着计算机能力的不断增强,我们使用计算机来解决比之前更大的问题,因此,在面对海量的数据时,算法的优劣就显得尤为重要。

  是否具有算法知识与技术的坚实基础是区分真正熟练的程序员与初学者的一个特征。使用现代计算技术,如果你对算法懂得不多,你也可以完成一些任务,但是,如果有一个好的算法背景,那么你可以做的事情就会多得多。

相关文章
|
算法 测试技术 开发工具
编写高效技术文档的艺术:C++项目实践指南
编写高效技术文档的艺术:C++项目实践指南
288 0
|
11月前
|
编解码 物联网 API
"揭秘SD文生图的神秘面纱:从选择模型到生成图像,一键解锁你的创意图像世界,你敢来挑战吗?"
【10月更文挑战第14天】Stable Diffusion(SD)文生图功能让用户通过文字描述生成复杂图像。过程包括:选择合适的SD模型(如二次元、2.5D、写实等),编写精准的提示词(正向和反向提示词),设置参数(迭代步数、采样方法、分辨率等),并调用API生成图像。示例代码展示了如何使用Python实现这一过程。
492 4
|
11月前
|
数据挖掘 UED
ChatGPT数据分析——探索性分析
ChatGPT数据分析——探索性分析
150 1
|
11月前
|
运维 自然语言处理 开发者
作为一名运维人员,使用通义灵码个人版处理日常工作中的代码相关任务,极大地提升了我的工作效率。以下是我使用通义灵码的具体实践场景、效果和心得,以及相应的截图。
作为一名运维人员,我使用通义灵码处理日常工作中的代码任务,效率提升了30%。通义灵码帮助我快速理解复杂代码、生成准确的代码注释,并能从自然语言生成代码示例,大幅减少了代码编写和理解的时间。
276 3
|
机器学习/深度学习 人工智能 算法
Stable Diffusion AI绘画
Stable Diffusion是人工智能领域的文本到图像生成模型,基于概率的连续扩散过程,学习数据潜在分布并生成新样本。模型使用Web UI进行交互,提供不同采样器如Euler和DPM++,后者常配以Karras算法。提示词对生成效果至关重要,可以利用GPT等生成提示词。用户还能调整参数如高清修复和批处理次数来影响生成的图像。此外,模型文件(ckpt/safetensors)和Lora微调模型需存放在正确目录以确保功能正常。
|
存储 canal 消息中间件
数据仓库系列(三)数仓分层的意义价值及如何设计数据分层
数据仓库系列(三)数仓分层的意义价值及如何设计数据分层
1738 0
数据仓库系列(三)数仓分层的意义价值及如何设计数据分层
|
机器学习/深度学习 自然语言处理
【大模型】在大语言模型的架构中,Transformer有何作用?
【5月更文挑战第5天】【大模型】在大语言模型的架构中,Transformer有何作用?
|
人工智能 搜索推荐 物联网
被鹅厂最新开源AI绘画工具PhotoMaker圈粉了,多风格头像生成器就靠它了!
被鹅厂最新开源AI绘画工具PhotoMaker圈粉了,多风格头像生成器就靠它了!
531 1
|
人工智能 算法
AI绘画佳作
使用AI绘画创作了一幅小孩在海边抓螃蟹的图片
712 1
|
人工智能 弹性计算 数据安全/隐私保护
如何在阿里云快速启动Stable Diffusion轻松玩转AI绘画
本文介绍如何如何在阿里云快速启动Stable Diffusion服务开启AI绘画
如何在阿里云快速启动Stable Diffusion轻松玩转AI绘画