算法+数据结构分享

简介: 在互联网、大数据、人工智能火爆的今天,“算法”这个词几乎妇孺皆知,业已成为“高薪”“牛X”的代名词。 应不少朋友的邀请,特连载本系列,旨在用最通俗的方式——“”讲人话、无废话、看得懂、用得上“”——将位于神龛之上的算法送进寻常百姓家。

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

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

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

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

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

  1. 重新定义问题,结构化描述
  2. 根据重定义,归类问题
  3. 根据问题类别,做经验匹配
  4. 根据匹配结果,分支处理:若匹配,采用经验方法;若匹配不上,设计开发新方法
  5. 迭代更新经验库,增强面向未来问题的能力

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

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

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

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

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

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

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

为什么要“重新定义问题,结构化描述”?
把人脑也看做一台机器的话,很显然这台机器的运行方式和效率与计算机有所不同(尽管现在的机器学习在尽可能地模拟人脑的机理,但是两者至少在现阶段还有本质不同)。

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

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

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;}
算法的“模样”(应对电灯不工作的算法——自然语言方式):
首先检查电源是否接好了:没有接好,接上。

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

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

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

_2_jpeg

How to use Algorithm?(如何使用算法)
算法的本质就是方法,既然是方法,就是一系列的操作;既然是操作,就必然有作用对象。 在软件程序设计中,这样的作用对象就是“数据结构”。

怎么来理解数据结构呢?

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

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

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

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

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

1.从硬件维度看:

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

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

2.从软件维度看:

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

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

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

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

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

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

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

硬件涉及到材料科学、制造工艺等一系列技术,这些是不能简单被算法替代的。所以,脱离上下文、一味强调算法的重要性是耍流氓。
来源商业新知网,原文标题:算法+数据结构(第01篇)走下神坛吧!算法

相关文章
|
2月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
71 1
|
2月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
82 0
|
10月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
409 1
|
6月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
189 10
 算法系列之数据结构-二叉树
|
6月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
157 3
 算法系列之数据结构-Huffman树
|
6月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
194 22
|
7月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
200 30
|
7月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
309 25
|
7月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
286 23
|
9月前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
190 20

热门文章

最新文章