龙空技术网

程序员数学终极指南:您需要了解的 10 个概念

启辰8 53

前言:

而今看官们对“算法复杂性分析了几个方面的复杂度”大约比较注意,兄弟们都需要剖析一些“算法复杂性分析了几个方面的复杂度”的相关知识。那么小编也在网上汇集了一些有关“算法复杂性分析了几个方面的复杂度””的相关内容,希望你们能喜欢,大家一起来了解一下吧!

随着世界技术变得更加先进,编程已成为许多人想要学习的一项关键技能。

然而,有一个常见的误解,认为编程不需要任何数学知识。这种说法并不完全正确。虽然你可以在没有数学的情况下进行编程,但学习数学可以使编程更容易理解,并且它可以解开整个物理宇宙的秘密。

然而,魔法并不是真正的数学。开发人员经常避免学习数学,因为它看起来很可怕,但他们没有意识到数学是所有编程的基础,从简单的代码到计算机图形和神经网络等复杂的程序。理解数学概念是真正工程师与新手的区别。

我们不是数学天才。我们恰恰相反,这使我们具有独特的资格来教授任何程序员都需要理解的十个基本数学概念。

1. 数字系统

纵观历史,人类曾使用过各种方法来计数事物,但大多数都是以数字“10”为基础。我们手上有十根手指,这就是我们用来数数的。例如,在数字423中,四在百位上代表四乘以百,二在十位上代表二乘十,三在个位上代表三乘一。

然而,计算机采用双数字系统(也称为二进制)工作。在基数 2 中,位值的概念与基数 10 的工作方式相同,但由于只有两个符号可供使用,因此每个位置都乘以 2。以 2 为基数的前几个数字是 1、2、4、8、16、32、64、128 等。每个数字都是前一个数字的两倍。

了解基数 2 对于理解其他数字系统(例如十六进制,基数为 16)至关重要。十六进制使用数字 0 到 9 以及 A 到 F 来表示数字。例如,十六进制中的数字 A 表示以 10 为基数的数字 10。十六进制通常用于更简洁地描述二进制值,因为每个十六进制数字可以转换为四位。

Base64 数字系统通过引入二进制值的附加字母和符号来提供更复杂的编码方案。因此,开发人员可以将包括图像在内的二进制数据作为文本字符串传送。其应用扩展到电子邮件附件和网页内容编码。

计算机采用基数 2,但仍需要以基数 10 表示数字才能便于人类理解。因此,应用程序和界面中的数字缩影以 10 为基数。为了在二进制系统中显示它们,必须将数字转换为 2 基数。

2.布尔代数

布尔代数代表了计算机科学和编程中的基本构造,在编写代码时几乎总是使用它。它是代数的一种变体,涉及只能有两个可能值(真或假)的二元变量。

在本次演讲中,我们将讨论布尔代数的基本元素,以及如何在编码中使用它们。

布尔代数中存在三种运算符:合取、析取和取反。

合取运算符(AND)用于融合两个或多个布尔值,并且仅当所有输入值都为 true 时,结果值才为 true。另一方面,析取运算符(OR)用于合并两个或多个布尔值,如果任何输入值为 true,则结果值为 true。否定运算符(NOT)用于反转布尔值,如果输入值为 false,则结果值为 true,如果输入值为 true,则结果值为 false。

为了阐明布尔代数的概念,让我们假设一个相关的例子。想象你正在努力争取一个重要的人。我们可以利用布尔变量“富裕”和“有吸引力”来定义你。如果你既富有又漂亮,你很可能会找到一个重要的人。

然而,如果你既不富裕也不有吸引力,你可能不得不向一个模范的重要人物支付报酬。如果你很富有或者很有吸引力,你仍然可以找到一个重要的人,但你的选择会受到更多限制。我们可以使用 if 语句在代码中演示此逻辑,或者我们可以使用维恩图直观地描绘它。

维恩图是一组元素的图形表示。在这种情况下,我们可以使用维恩图来显示布尔值的各种组合。真值表是另一种直观地表示布尔值的方法。真值表是展示输入值和结果输出值的所有可能组合的表。

3.计算机科学中的浮点数

在计算机科学领域处理数值时,最普遍的方法之一是利用浮点数。这些数字实体为程序员提供了平衡精度和范围的选项,因为这些值的存储容量是有限的。

如果不熟悉浮点数,人们可能会质疑计算机如何生成无意义的结果,例如将 0.1 和 0.2 加起来得到 0.30004。解释在于科学领域,根据测量的范围,数字的范围可能很大。

为了避免完整列出这些数值,科学界使用科学记数法,即指数将数字提升为四舍五入值,从而创建更简洁的数值形式。考虑到存储容量的限制,计算机的运行方式与浮点数类似。

特别是,单精度浮点数需要 32 位,而双精度浮点数(Python 和 JavaScript 等编程语言中的默认值)需要 64 位。这就是为什么它们被视为“浮点数”,因为数值在小数点之前或之后没有固定的位数。

浮点数是编程中广泛使用的数字格式。然而,由于其二进制性质,特定值(例如 0.01)无法以这种格式精确表示。因此,在使用浮点数执行运算时,可能会出现微小的误差,通常称为舍入误差。

为了避免这些不准确的情况,程序员必须了解浮点数的限制并相应地对其代码进行调整。这可能需要改变操作顺序、采用更高精度的数据类型或应用舍入函数来纠正任何差异。必须承认并解决这些问题,才能在计算任务中产生准确可靠的结果。

4. 对数

对数函数是代数中的基本概念,经常在高中数学课程中教授。为了更好地理解这些功能,请考虑一根实际的原木,例如一块长木头。原木的长度从 16 英尺开始,逐渐锯成两半,直到达到 2 英尺的长度。观察通过日志绘制的线是如何逐渐弯曲而不是完全笔直的。

在计算机科学中,这条渐变曲线代表了多种算法的操作,包括二分搜索。然而,有趣的是,如果已知原木被切割的次数,则对该值进行 2 次方即可得出原木的原始长度。在这种情况下,使用了四次切割来实现 2 英尺的长度;因此,2 的 4 次方就得到了原木的原始长度。这称为求幂。

相反,对数是指数的精确逆运算。假设我们不知道指数,但知道圆木的原始长度,并且我们想要确定圆木必须被切割多少次才能达到 2 英尺的长度。这可以使用原始长度的以 2 为底的对数来计算,得到的值为 4。当以 2 为底时,它被定向为二进制对数。然而,在数学中,以 10 为底的常用对数更为普遍。

对数函数的应用超出了数学范围,包括科学、工程和计算机科学。它们协助解决与增长率、声级和地震震级等相关的问题。此外,它们还用于金融,例如计算利率和复合增长。

5.集合论

对于那些刚刚接触计算机科学或编程领域的人来说,集合论可能看起来很陌生。然而,本质上,它是对不同的、无序实体的集合的研究。本文旨在更深入地探讨集合论的复杂运作及其在计算机科学和编程领域的作用。

关系数据库展示了集合论实际应用的一个主要例子。在这些数据库中,表是由唯一的行数组组成的资产。这些表可以通过集合论以多种方式组合。例如,如果您希望选择两个表上匹配的记录,则将采用内部联接(也称为交集)。相反,如果您的目标是从两个表中获取所有匹配记录,则将使用完全外连接或集合论中的并集。

当合并左连接和右连接时,这些概念结合在一起。通过合并两个集合之间的差异的交集,形成一个新集合,该新集合仅包含两个集合共有的元素。

至关重要的是要理解,上述结构在元素数量方面是有限的,属于离散数学的范围。相反,连续数学,例如几何和微积分,处理实数和近似值。

集合论在计算机科学和编程领域发挥着至关重要的作用,因为它能够组织和操作数据。了解集合论后,我们可以对数据集执行各种操作,包括排序、过滤和聚合。

6.线性代数

线性代数是理解计算机图形学和深度神经网络所必需的数学分支。要理解它,您必须首先了解三个基本术语:标量、向量和矩阵。

标量是单个数值。另一方面,向量是数字列表,与一维数组相当。最后,矩阵就像一个网格或二维数组,包含数值的行和列。

向量和矩阵的迷人之处在于它们表示点、方向和变换的能力。向量可以表示三维空间中的点和方向,而矩阵可以表示这些向量发生的变换。

考虑一下:当您在视频游戏中移动玩家时,灯光和阴影以及图形都会发生神奇的变化。但这不是魔法;而是魔法。它是分布在 GPU 上的线性代数。

线性变换可能是一个复杂的问题,但让我们检查一个特定的场景。考虑一个立即驻留在 0.2X 3Y 处的 2D 矢量,表示图像中的一个孤立点。缩放、平移、旋转、剪切和其他线性变换的应用是一个可能的探索途径。然而,假设目的是将点更改为 4X 6Y。在这种情况下,需要缩放因子的矩阵表示,同时将精确点修改为列向量。通过使用矩阵乘法,可以将该点移动到所需的位置。

广泛利用这种操作的一个领域是密码学,更具体地是RSA加密。此外,深度神经网络依赖于向量作为表示特征的手段。通过矩阵乘法,数据可以在网络节点之间传播。尽管这些转换背后的数学看似简单,但处理大量数据所需的计算能力却是惊人的。数学研究对于理解计算机的魔力来说是不可或缺的。

7.组合学

组合学是计算和理解模式的艺术。它处理集合的组合和排列,并用于从应用程序算法到全局数据库的各种应用程序。在本文中,我们将探讨组合学的概念及其在各个领域的相关性。

组合学就是对事物进行计数,尤其是在将集合组合成组合或排列时。例如,如果您有一个像 Tinder 这样的应用程序,您可能需要计算所有可能的匹配组合,作为更复杂算法的一部分,该算法计算出向最终用户显示的内容。同样,如果您正在构建一个全球分布式数据库,您需要计算出您在全球范围内需要多少个数据库分区。最终,这一切都是为了理解模式是如何出现的。

斐波那契数列是组合数学工作原理的一个很好的例子。斐波那契数列的公式如下图所示。编写一个生成它的函数是一个很好的练习,可以让您掌握组合学的概念。谷歌的工程师使用相同的逻辑在谷歌地图等工具上渲染图块。斐波那契数列也很普遍,我们可以在鹦鹉螺壳的螺旋或葵花籽的排列中看到它。

组合学与图论密切相关。图论涉及图的研究,图是用于解释事物之间成对关系的数学模型。图论广泛应用于计算机科学、电信和社交网络分析。

8. 统计

人工智能是一个严重依赖统计学原理的研究领域。该领域涉及开发可以从数据中学习并根据该信息做出预测或决策的算法和模型。从本质上讲,机器学习是一种执行统计分析的复杂方法。

本文旨在阐述统计在人工智能领域的重要性,并概述一些对于任何寻求人工智能职业的人都至关重要的基本统计概念。当您与 ChatGPT 等人工智能聊天机器人交互时,系统会根据统计模型计算符合输入提示的概率,从而生成响应。

必须清楚地掌握集中趋势的度量,即均值、中位数和众数,它们是必要的统计工具。此外,理解标准差的概念至关重要,因为它有助于研究数据集中的值与平均值的接近或远离程度。

线性和逻辑回归是人工智能中常用的两种关键统计方法。在线性回归中,目标是预测连续值,例如以货币形式表示的损失或收益。输入和输出变量之间的相关性是线性的,主要目标是找到最适合数据集的线。

另一方面,逻辑回归在不同的问题场景中有效,例如分类,例如区分热狗和非热狗的图像。在这种情况下,输入和输出变量之间的关系不是线性的,而是一个预测布尔变量为真或假的概率的 sigmoid 函数。

9. 复杂性理论

复杂性理论使我们能够了解算法理想情况下应该使用多少时间和内存。大O符号在复杂性理论中用于表示复杂性。

关于时间复杂度,输入表示执行给定任务所需的步骤数。例如,从数组中提取单个元素将得到 0 of 1,这是常数时间,非常快速且简单。相反,遍历数组会得到 n 的 0,其中 n 是数组的长度。如果在该循环的每次迭代中,我们再次遍历同一个数组,则会产生 N 平方的 0,这明显降低了效率。

像二分搜索这样的复杂算法,每次迭代都会将搜索空间减半,从而产生对数时间复杂度。了解复杂性的衡量是技术面试的基础,也是一般情况下的必要考虑因素。

当试图理解复杂性理论时,必须理解时间复杂性。算法的时间复杂度表示完成任务所需的步骤数。算法采用的步骤越多,消耗的时间和内存就越多。因此,了解如何衡量时间和内存的复杂性至关重要。

大 O 表示法经常用于表达时间复杂度。它是定义函数增长率上限的数学符号。符号 O(1) 表示恒定的时间复杂度,这表明无论输入大小如何,该方法都花费相同的时间。相反,O(n) 表示线性时间复杂度,这意味着算法的运行时间随着输入大小线性增加。类似地,O(N²) 表示二次时间复杂度,这意味着算法的运行时间随着输入大小呈指数增长。

例如,如果我们需要遍历一个大小为 n 的数组,则时间复杂度将为 O(n)。然而,如果我们在该循环的每次迭代中再次交叉相同的显示,时间复杂度将为 O(n²),效率相当低。

二分搜索是一种更复杂的算法,每次迭代都会将搜索区域减半,从而产生对数时间复杂度。理解不同算法的时间复杂度之间的权衡对于为给定任务选择最有效的算法至关重要。

10.图论

当谈到数据结构时,图表是最强大、最通用的工具之一。图表用于表示对象或概念之间的复杂关系,并且可以在从社交网络到交通系统的一切事物中找到。在本文中,我们将仔细研究什么是图,以及如何在编程和数据分析中使用它。

在最基本的层面上,图由两种类型的元素组成:节点(也称为顶点)和边。节点是图中的各个元素,而边是这些元素之间的连接。例如,在社交网络中,一个人可能是一个节点,两个人之间的关系可能是一条边。如果你爱你的妈妈,你的妈妈也爱你,这就是无向图的一个例子,因为这种关系是双向的。另一方面,如果你爱你的 OnlyFans 女朋友,但她不爱你,这将是一个有向图,因为这种关系只是单向的。

边缘也可以加权,这意味着一种关系比另一种关系更重要。例如,在交通网络中,某些道路可能比其他道路更快或更高效,并且这些关系可以通过加权边来表示。

确定图是有环图还是无环图是图论中的一个重要因素。如果一个节点可以遍历回自身,那么它被认为是循环的,否则,它被称为非循环的。这种区别具有重要意义,因为它影响可用于检查或操作图表的算法。

作为软件开发人员,从头开始构建图表是一项常见的活动。然而,更重要的是了解如何遍历它们。遍历表示探索图以定位特定节点或关系的过程。可以使用多种算法进行图遍历,但最流行的方法之一是 Dijkstra 算法。该方法用于发现通过图的最有效路线。

标签: #算法复杂性分析了几个方面的复杂度 #无向图建立