关于算法,我们都应知道的

2023-11-16

定义:

算法是指对特定问题求解步骤的一种描述。

 

 

特性:

(1)有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止。

(2)确定性:每条语句有确定的含义,无歧义。

(3)可行性:算法在当前环境条件下可以通过有限次运算实现。

(4)输入输出:有零个或多个输入,一个或多个输出。

 

 

“好”算法的标准如下:

(1)正确性:正确性是指算法能够满足具体问题的需求,程序运行正常,无语法错误,能够通过典型的软件测试,达到预期的需求。

(2)易读性:算法遵循标识符命名规则,简洁易懂,注释语句恰当适量,方便自己和他人阅读,便于后期调试和修改。

(3)健壮性:算法对非法数据及操作有较好的反应和处理。例如,在学生信息管理系统中登记学生年龄时,若将21岁误输入为210岁,系统应该提示出错。

 

(4)高效性:高效性是指算法运行效率高,即算法运行所消耗的时间短。算法时间复杂度就是算法运行需要的时间。现代计算机一秒钟能计算数亿次,因此不能用秒来具体计算算法消耗的时间,由于相同配置的计算机进行一次基本运算的时间是一定的,我们可以用算法基本运算的执行次数来衡量算法的效率。因此,将算法基本运算的执行次数作为时间复杂度的衡量标准。

(5)低存储性:低存储性是指算法所需要的存储空间低。对于像手机、平板电脑这样的嵌入式设备,算法如果占用空间过大,则无法运行。算法占用的空间大小称为空间复杂度。

 

 

算法的两大分类:

一个是数据结构(数据对象)数、矩阵、集合、串、排列、图、表达式、分布等。

另一个是算法策略贪心、分治、动态规划、线性规划、搜索等。

 

这两条线索是相互独立的:同一个数据对象(比如图)上有不同的问题(如单源最短路径和多源最短路径),就可以用到不同的算法策略(例如贪婪和动态规划);而完全不同的数据对象上的问题(如排序和整数乘法),也许就会用到相同的算法策略(如分治)。

 

 

如何学习算法(个人想法):

(1)HACK精神:对这个事物拥有这极高的热情,对这个事物有一种快速掌握的渴望,对这个事物不断问为什么,亲自去做并在这个过程中明白当初问为什么的到底是个啥以及明白这个问题的答案是什么。

(2)数学与逻辑:在我的学习编程或是在学习算法的过程中,无数次的实践告所我——算法的灵魂是数学以及思维逻辑。例如,在编程1+2+3+ …… +n时,采用 "for(int i=1;i<=n;i++) { sum+=i; }" 和直接用等差数列求和公式是完全不一样的。所以掌握一定的数学和逻辑方法是必要的。

(3)适合自己的学习材料:对于我来说,学习一样新的事物,学习的资料是十分重要的,或者直接说,学习的材料直接决定我第一次学习时的效率和深度;那么对于你来说,也是一样,找到真正适合自己的学习材料是你在学习前应该着重做的事情;那么,应该怎么找寻材料呢?例如,图书馆的图书,博客,个人网站等;需要注意的是,如果选择博客或个人网站作为学习材料,那个博客或个人网站应该有成体系的知识结构和层次。

(4)去做:当你看懂了材料所描述以后,立即需要做的就是去实现它——自动编程实现它,这是为了避免“产生了学会了的错觉,实际上是看懂了的感觉”。其次,也是最重要的,就是做好笔记,便于复习。在做笔记时,我的原则是“① 不做冗余的笔记——只有自己真正实践或理解才做;笔记的真正目的是为了以后的快速复习! ② 在自己所做的笔记中,无论知识怎么难,只要是理解了所做的笔记,如果在下一次去看,不能快速看懂的,就是垃圾一样的笔记!”

(5)适时复习:这一点没什么可说的,你可以参考“艾宾浩斯遗忘曲线”来自定义复习时间。

 

 

[ 注: 部分内容出自《趣味算法》作者:陈小玉 (人民邮电出版社) ]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于算法,我们都应知道的 的相关文章

  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 检索受“rowspan”影响的行的列索引的最有效方法是什么?

    考虑下表 table thead tr th th th A th th B th th C th tr thead tbody tr th 1 th td Apples td td Oranges td td Pears td tr tb
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 需要一种将网络块范围折叠为超集范围列表的算法

    我的数学不及格 我需要一种有效的方法将网络范围缩小为超集 例如如果我输入 IP 范围列表 1 1 1 1至2 2 2 5 1 1 1 2至2 2 2 4 10 5 5 5至155 5 5 5 10 5 5 6至10 5 5 7 我想返回以下
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • 照片马赛克算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

    Hy 我要做的是创建一个程序 使用 C 或 C 它将 24 位 像素位图和图像集合作为输入 我必须创建一个马赛克图像 类似于使用库的输入图像给定的图像 创建与输入类似的马赛克照片 到目前为止 我可以访问输入的图像像素及其颜色 但我有点卡住了
  • 平铺单纯形噪声?

    我 作为业余爱好者 对伪随机噪声生成很感兴趣 特别是 Perlin 和 Simplex 算法 Simplex 的优点是速度 尤其是在更高的维度上 但 Perlin 可以相对容易地平铺 我想知道是否有人知道平铺单纯形算法 固定维度就好 泛型更
  • 动态规划 (DP) 中的重叠子问题是什么?

    为了使动态规划适用 问题必须具有两个关键属性 最优子结构 and 重叠子问题 1 https en wikipedia org wiki Dynamic programming 对于这个问题 我们只关注后一个属性 有各种不同的定义重叠子问题
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 将名称字符串编码为唯一的数字

    我有一大堆名字 数以百万计 他们每个人都有一个名字 一个可选的中间名和一个姓氏 我需要将这些名称编码为唯一代表这些名称的数字 编码应该是一对一的 即一个名称只能与一个数字相关联 一个数字只能与一个名称相关联 对此进行编码的明智方法是什么 我

随机推荐

  • vue-loade和vue的版本问题,webpack5

    npm add D vue template compiler 2 6 14 vue loader 15 9 8 const VueLoaderPlugin require vue loader vue加载器 使用node语法获得动态路径
  • Nginx配置文件详细说明

    原创 http www cnblogs com xiaogangqq123 archive 2011 03 02 1969006 html 在此记录下Nginx服务器nginx conf的配置文件说明 部分注释收集与网络 运行用户 user
  • 微信小程序:自定义导航栏

    看到有的微信小程序的页面左上角有了个 小房子 可以返回首页 这是怎么做到的 其实这是微信开放的自定义的自定义导航栏来完成 但是最开始 对于一个页面很多的小程序 其实有点一言难尽 因为你自定义 你可能要所有页面都要添加一遍 现在小程序可以自定
  • 34. Search for a Range

    这道题一开始没看别人的算法 第一个想法是用递归做 自己憋了两个小时终于憋出来了 然而超时 递归的想法是先用二分法找到一个target 然后从target左右再用二分法找边界 然而 真的是 太慢了 class Solution public
  • VSCode问题记录

    20230304 0 引言 这几年的编程方式还真是各种变化 从一开始直接VIM 到后面使用jupyter进行机器学习相关 然后再过渡到vim的形式并加以tmux批量化 最后去年使用了vscode作为IDE 随着工具的变化 那么很多习惯也都随
  • UnityVR--EventManager--事件中心2

    目录 前言 事件中心的结构 EventManager事件管理器 EventType事件类型 EventListener监听及回调 EventDataBase回调时需要传递的参数 总结 前言 上一篇 事件中心1 中 简单解释了委托 事件 监听
  • 【Java SE】类和对象(全网最细详解)

    点进来你就是我的人了博主主页 戳一戳 欢迎大佬指点 欢迎志同道合的朋友一起加油喔 目录 前言 一 面向对象的初步认知 1 什么是面向对象 2 面向对象和面向过程的区别 二 类和对象的基本概念 三 类和对象的定义和使用 1 类的创建 2 对象
  • 数据库的url配置8.0

    spring datasource username root spring datasource password lhh12345 spring datasource url jdbc mysql localhost 3306 myba
  • numpy.diag()结构及用法

    numpy diag v k 0 官方文档 以一维数组的形式返回方阵的对角线 或非对角线 元素 或将一维数组转换成方阵 非对角线元素为0 两种功能角色转变取决于输入的v 1 更深层的见numpy diagnal 参数详解 v array l
  • windows获取系统DPI

    dc GetDeviceCaps LOGPIXELSX 每英寸水平逻辑像素数 dc GetDeviceCaps LOGPIXELSY 每英寸垂直逻辑像素数 dc GetDeviceCaps HORZRES 水平像素总数 dc GetDevi
  • [Java]获取java方法注释实例

    Method methods company class getMethod getId null PK pk methods getAnnotation PK class System out println pk
  • vue指令中v-show和v-if以及keep-alive的区别

    v if 属于条件显示 满足条件就显示元素 不满足就删除元素 通过操作DOM元素完成 v if的首次渲染显示的开销较小 因为它只渲染满足条件的那一个元素 切换组件时 其开销较大 因为它每切换以此就要重新触发生命周期渲染显示新元素 v if值
  • JS实现轮播图(自动+手动)

    网页轮播图效果 核心原理 tips 代码在文章末尾 这个ul就是我们这四张图片的父盒子 我们通过对这个父盒子添加动画函数来实现移动 然后给父盒子来一个溢出隐藏就达到了轮播的效果 动画函数如下 function animate obj tar
  • 【python爬虫】8.温故而知新

    文章目录 前言 回顾前路 代码实现 体验代码 功能拆解 获取数据 解析提取数据 存储数据 程序实现与总结 前言 Hello又见面了 上一关我们学习了爬虫数据的存储 并成功将QQ音乐周杰伦歌曲信息的数据存储进了csv文件和excel文件 学到
  • 8.typescript-函数的类型

    今儿个甚是乏累呢 但是 lt 下面可能是正题儿 gt 1 函数声明 1 function student x string y number string 2 return 我是 x 今年 y 岁 3 4 5 console log stu
  • 商品期货怎么玩? 1手交易需要多少钱?

    期货市场中有许多大宗商品 把他们统称为商品期货 近几年我国商品期货品种不时在增加 固然期货风险比较高 但收益也十分可观 而且商品期货开户几乎没有门槛 国内商品期货免费开户 无资金限制 凭身份证和银行卡即可办理 开设期货帐户 能在网上开期货帐
  • Unity XCode iOS 实现拍照和相册选择上传头像

    显示弹窗 通过UIAlertController来创建一个弹窗 if defined cplusplus extern C endif 导出接口供unity使用 void IOS Open IOSCameraController app I
  • 剑指 Offer 25. 合并两个排序的链表(java+python)

    输入两个递增排序的链表 合并这两个链表并使新链表中的节点仍然是递增排序的 示例1 输入 1 gt 2 gt 4 1 gt 3 gt 4 输出 1 gt 1 gt 2 gt 3 gt 4 gt 4 限制 0 lt 链表长度 lt 1000 思
  • sql语句学习(b站韩顺平的demo)

    表的CRUD varchar varchar2 char的区别 时间 时间戳使用 创建表 创建一张表 表结构与已经存在的表一致 查看表的信息 表中增加一列 修改表中的列 删除表中的列 修改表名 修改表的字符集 修改表中的列名 表中数据的插入
  • 关于算法,我们都应知道的

    定义 算法是指对特定问题求解步骤的一种描述 特性 1 有穷性 算法是由若干条指令组成的有穷序列 总是在执行若干次后结束 不可能永不停止 2 确定性 每条语句有确定的含义 无歧义 3 可行性 算法在当前环境条件下可以通过有限次运算实现 4 输