数据结构+算法(第01篇):走下神坛吧!算法

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

引言

在互联网、大数据、人工智能火爆的今天,“算法”这个词几乎妇孺皆知,业已成为“高薪”“牛X”的代名词。

应不少朋友的邀请,特连载本系列,旨在用最通俗的方式——“”讲人话、无废话、看得懂、用得上“”——将位于神龛之上的算法送进寻常百姓家。

本篇作为系列的第一篇,采用“What、Why、How”文章结构,来给大家普及一下算法的基本概念(也纠正一些朋友的错误概念)。

What is Algorithm?(算法是个什么鬼 )

为了不落入俗套,本文不会重复wiki上“算法”的官方定义,而采用启发式结构来阐述算法的本质,试想平时在遇到问题的时候,我们是如何解决的。

朴素而广泛的过程方法论如下:

  1. 重新定义问题,结构化描述

  2. 根据重定义,归类问题

  3. 根据问题类别,做经验匹配

  4. 根据匹配结果,分支处理:若匹配,采用经验方法;若匹配不上,设计开发新方法

  5. 迭代更新经验库,增强面向未来问题的能力

与算法相关的就是上面的第3步~第5步。

简单来说,算法本质是:解决某类问题的方法。如果方法已经在经验库里了,直接拿来主义,也就是“既有算法”;如果不在,那么设计开发的新方法,新方法就是“新算法”。

当然还有一种情况:虽然经验库里有针对该类问题的方法了,但是设计开发了一个更有效的新方法,那么也称为“新算法”。下面来对几个关键点进行阐述!!!

什么是“更有效的算法”?

“更有效”的背后逻辑其实比较的就是“代价”,或者称为“开销”。经济上衡量就是成本,它分为两个维度:时间成本和资源成本。

资源成本在计算机上的体现就是硬盘、内存、CPU等一系列硬件资源开销。对这些硬件资源开销进一步抽象,就是空间成本。

算法其实从学科分类上讲,属于计算数学,计算数学属于应用数学。用学科术语来描述时间成本与空间成本,就是计算复杂度,很自然地,它也有两个维度:时间复杂度和空间复杂度。描述复杂度的数学符号是O()。后面我们会详细介绍O()的表达。

综上所述,所谓的“更有效”的算法,指的就是时间复杂度或者空间复杂度更优的算法。

为什么要“重新定义问题,结构化描述”?

把人脑也看做一台机器的话,很显然这台机器的运行方式和效率与计算机有所不同(尽管现在的机器学习在尽可能地模拟人脑的机理,但是两者至少在现阶段还有本质不同)。

人脑在连续信号和非结构化场景下的处理能力是卓越的,但是计算机只能处理离散信号,并且必须最终转化成结构化数据才能进行处理(尽管现在的机器学习可以通过自我学习来将数据结构化)。

用一张图来描述这个过程就是:

Why to use Algorithm?(算法有什么鬼用)

从上面对解决现实问题的过程方法论的描述中,其实已经可以看出算法的价值就在于:经验的重用。

套用一句IT行话就是“不要重复制造轮子”。好了,既然现在你已经对算法有了大致的感性认识,那么接下来根据人类的学习习惯,就需要来看看抽象的算法概念,在现实里到底“长什么模样”。

很多人认为“算法=程序或者程序”,这其实是一个狭义的理解。如前面所说的,算法的本质是解决某类问题的方法,而程序或者代码只是方法的一种表达形式而已。你也可以用自然语言或者伪代码来进行表达算法。

算法的“模样”(应对电灯不工作的算法——代码方式):

    public STATUS_CODE lamp_issue_handler() {  STATUS_CODE ret_val = UNKNOWN_ISSUE; if (!isPowerOn(this)) {   ret_val = powerOn(this) ? NOT_POWER_ON_ISSUE : POWER_ISSE;  }  else if(!isBulbCrash(this)) {   ret_val = replaceBulb(this) ? BULB_CRASH_ISSUE : REPLACE_ISSUE;  }  else {    ret_val = fixBulb(this) ? BULB_FIXABLE_ISSUE : FIX_FAILURE_ISSUE;}  return ret_val;}

算法的“模样”(应对电灯不工作的算法——自然语言方式):

首先检查电源是否接好了:没有接好,接上。

如果接上了仍然不工作,看看灯泡是否烧坏了:如果是,换个新灯泡

如果灯泡没有烧坏,修理灯泡

算法的“模样”(应对电灯不工作的算法——流程图方式):

How to use Algorithm?(如何使用算法)

算法的本质就是方法,既然是方法,就是一系列的操作;既然是操作,就必然有作用对象。在软件程序设计中,这样的作用对象就是“数据结构”。

怎么来理解数据结构呢?

前面我们讲到了,解决问题的第一步就是要将问题结构化描述。结构化描述的本质就是利用一系列便于操作的“基础元素”来表达。

那么怎样的“基础元素”是便于操作的呢?

首先我们要清楚,操作的主体是谁。从上一段的阐述来看,这个主体貌似是算法,但是我们注意,算法不是凭空去运行的,是要在计算机上运行的。

所以归根结底,操作的主体是计算机。所以,这里所谓的“便于操作”指的是便于计算机运行。

计算机运行有两个维度:硬件维度和软件维度。

1.从硬件维度看:

学过计算机组成原理就知道,程序是在计算机的CPU高速缓存和内存中运行的。对应的存储结构,通常都是线性的。

为了充分提升线性结构的性能优势,硬件厂商(如CPU厂商)在设计硬件时,就抽象了针对一些结构(如堆栈)的操作(如压栈、出栈),所以很自然地,这样的结构就应该作为数据结构。

2.从软件维度看:

我们编写的应用程序一般不会直接运行在硬件之上,而是运行在操作系统、运行时或者虚拟机(如JVM)之上。

所以操作系统、运行时或者虚拟机已经抽象的结构(如数组、队列、树、图等),也应该作为数据结构。

上面赘述了这么多,其实就是要表达一个观点:算法是要配合数据结构的,抛开数据结构谈算法就是无源之水、无根之树。

看到这里,我想你一定彻底明白,为什么图灵奖得主尼古拉斯·沃斯会提出那个著名的等式了:程序 = 算法 +数据结构。

总结

看到这里,相信你已经对算法这个概念已经不再陌生,它对于你而言也不再高高在上。

无论在大学学习,还是在工作中,大家都几乎被一种说法反复洗脑:算法非常重要,它是计算机的灵魂。

在这里,我想纠正一下这个错误的观点。首先,广义的算法不仅仅只是软件算法;再次,计算机系统不仅仅只是由软件构成,还有硬件。

硬件涉及到材料科学、制造工艺等一系列技术,这些是不能简单被算法替代的。所以,脱离上下文、一味强调算法的重要性是耍流氓。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技云报道:新趋势下,国产数据库或“春山可望”

科技云报道原创。 从540亿元到1286亿元——这是中国通信标准化协会大数据技术标准推进委员会针对中国数据库行业给出的一份预测报告。 报告指出,未来五年,中国数据库行业将从百亿级市场跨越成为千亿级市场。 最近两年,中国的数据库行业似乎…

Docker核心教程

1. 概述 官网:https://docs.docker.com/ Docker Hub 网站:https://hub.docker.com/ 容器较为官方的解释: 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立…

leetcode—跳跃游戏—贪心算法

1 跳跃游戏1 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1&a…

Codeforces Round 922 (Div. 2)补题

Brick Wall(Problem - A - Codeforces) 题目大意:规定砖的大小为1*k(k>2),现在有一面n*m的砖墙,n是墙高,m是墙宽,砖在砖墙中有两种放法,水平放置和竖直放置&#xff…

注册亚马逊店铺用动态IP可以吗?

注册亚马逊店铺可以用动态IP,只要是独立且干净的网线就没问题,亚马逊规则要求一个IP地址只能出现一个亚马逊店铺,若使用不当会导致关联账户。 固定ip可以给我们的账户带来更多的安全,要知道关联问题是亚马逊上的一个大问题&#…

《动手学深度学习(PyTorch版)》笔记4.8

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过。…

人工智能基础-Numpy.array基本操作

基本属性 查看维度 x.ndim查看维度(元组形式) x.shape元素个数 x.size数据访问 子矩阵 内容同步修改 加是copy()则不同步修改 Reshape 修改维度 参数为-1时自动识别个数 合并 np.concatenate([x, y])沿着列合并 np.co…

第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)题解

尝试再做一次,我记得还是有点难,我会尽量多写一点解析,尽量让基础比较弱的友友也能看懂,希望能给你带来帮助 目录 1. 日期统计 题目描述 解题思路 具体代码 2. 01 串的熵 题目描述 解题思路 具体代码 3. 冶炼金属 题目…

如何编写具有完备性的测试用例 ? 具体思路是什么 ? 全套解决方案打包呈现给你 。

设计测试用例应该算是测试人员最为主要的工作之一 ,好的测试用例往往具有覆盖性强 ,扩展性高以及复用性好等特点 。该如何设计出好的测试用例 ?是我们每一位测试人员需要重点思考的问题 ,下面是我对设计测试用例设计的思考 &#…

#RAG|NLP|Jieba|PDF2WORD# pdf转word-换行问题

文档在生成PDF时,文宁都发生了什么。本文讲解了配置对象、resources对象和content对象的作用,以及字体、宇号、坐标、文本摆放等过程。同时,还解释了为什么PDF转word或转文字都是一行一行的以及为什么页眉页脚的问题会加大识别难度。最后提到了文本的编码和PDF中缺少文档结构标…

如何输入手机验证码才能查询?确保本人查询!

易查分的手机验证码功能可以通过预留手机号,让用户查询时输入验证码,确保是本人进行查询。本次就来介绍如何开启【手机验证码功能】。 📌使用教程 01准备电子表格 在准备表格时,建立查询时,查询条件必须设置两个或者两…

ElementUI 组件:Container 布局容器实例

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 项目里el-container-example.vue代码 <script> export default {name: el_container_example,data() {const item {date: 2024-01-31,name: 国龙,address: 上海市某区…

Mac 终端可以使用yarn,但是vscode里面报错segmentation fault

Mac 终端可以使用yarn 但是vscode里面报错segmentation fault 查阅官网https://www.yarnpkg.cn/getting-started/install 在vscode运行corepack enable即可解决该问题

网络异常案例五_SYN被丢弃

问题现象 公司同事使用的时候&#xff0c;反馈系统不稳定&#xff0c;访问的时候&#xff0c;有时候会出现白屏&#xff08;连接超时&#xff09;&#xff0c;或者系统页面点击没有响应&#xff0c;过一会之后刷新系统又可以正常展示了。之前未收到过类似反馈&#xff0c;一直…

20240131在WIN10下配置whisper

20240131在WIN10下配置whisper 2024/1/31 18:25 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】800&#xffe5; 2、请正确安装好NVIDIA最新的545版本的驱动程序和CUDA。 2、安装Torch 3、配置whisper http…

2024年数学建模美赛 分析与编程

2024年数学建模美赛 分析与编程 1、本专栏将在2024年美赛题目公布后&#xff0c;进行深入分析&#xff0c;建议收藏&#xff1b; 2、本专栏对2023年赛题&#xff0c;其它题目分析详见专题讨论&#xff1b; 2023年数学建模美赛A题&#xff08;A drought stricken plant communi…

k8s Sidecar filebeat 收集容器中的trace日志和app日志

目录 一、背景 二、设计 三、具体实现 Filebeat配置 K8S SideCar yaml Logstash配置 一、背景 将容器中服务的trace日志和应用日志收集到KAFKA&#xff0c;需要注意的是 trace 日志和app 日志需要存放在同一个KAFKA两个不同的topic中。分别为APP_TOPIC和TRACE_TOPIC 二、…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程&#xff1a;https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

Java 的 Map 與 List

通過重新new 一個ArrayList 轉化 resTask.setList(new ArrayList<Group>(custMap.values())); 无序的Map List 有序的数据放到Map&#xff0c;就变成无序。 List排序 按照code 的字母进行排序A-Z resTask.getListData().sort(Comparator.comparing(Gmer::getCode));…

Hadoop3.x基础(2)- HDFS

来源&#xff1a;B站尚硅谷 目录 HDFS概述HDFS产出背景及定义HDFS优缺点HDFS组成架构HDFS文件块大小&#xff08;面试重点&#xff09; HDFS的Shell操作&#xff08;开发重点&#xff09;基本语法命令大全常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作HDFS的API案例…