视频: 20180103 【權證小哥 短線操作教學】搞懂「差槓比」!優質權證一把抓 2024
作者:John Paul Mueller,Luca Massaron
算法不需要枯燥或难以使用。事实上,算法以许多方式围绕着你,你可能没有想过,你每天都在使用它们来执行重要的任务。但是,您需要能够使用算法而不必成为数学家。编程语言使您能够描述用于创建算法的步骤。有些语言比其他语言更擅长执行这个任务,人们不需要成为计算机科学家就可以理解。 Python使得使用算法变得更容易,因为它带有大量的内置和扩展支持(通过使用包,数据集和其他资源)。这个备忘单可以帮助您访问最常用的技巧,使您可以快速简单地使用算法。
<!找到您需要的算法
下表描述了您可能会发现对各种类型的数据分析有用的算法和算法类型。 (您可以在Algorithms For Dummies中找到所有这些算法的讨论。)算法
描述
有用的链接 | A *搜索 | 该算法跟踪节点的成本,方程: |
f(n) | = g(n) + h(n) ,其中: <! g(n) 是迄今到达节点的成本h(n)是到达节点的估计成本来自节点的目标f(n)
是从n到目标的路径的估计成本
这个想法是首先搜索最有希望的路径并避免昂贵的路径。 斯坦福。 edu 平衡树 一种通过重组保持平衡结构的树,可以减少访问时间。最左侧的元素数量与右侧的数量不同。 Webdocs 双向搜索 此技术从根节点和目标节点同时搜索,直到两个搜索路径在中间相遇。这种方法的一个优点是它比较省时,因为它发现解决方案比许多其他的蛮力解决方案更快。此外,它比其他方法更有效地使用内存,并总是找到解决方案。主要缺点是执行的复杂性。 计划。 cs |
Binary Tree |
这是一种包含连接到零(叶节点),一个或两个(分支节点)其他节点的节点的树的类型。每个节点定义了它必须包含的三个元素来提供连接和存储数据:数据存储,左连接和右连接。 | CS。 CMU。 edu | 广度优先搜索 |
这项技术从根节点开始,首先探索每个子节点,然后才会下移到下一个级别。它逐级进行,直到找到解决方案。这种算法的缺点是它必须将每个节点存储在内存中,这意味着它为大量的节点使用了大量的内存。这种技术可以检查重复的节点,这可以节省时间,并且总是提出一个解决方案。汗学院 | 蛮力 | 这是一个解决问题的技巧,在这个技巧中,有人尝试每一个可能的解决方案,寻找最好的问题解决方案。暴力技术确实存在一个最佳解决方案,但实施起来非常耗时,大多数人都避免这种方法。 |
IGM。 univ | 深度优先搜索 | 该技术从根节点开始,探索一组连接的子节点,直到到达叶节点。它按分支进行分支直到找到解决方案。这种算法的缺点是不能检查重复的节点,这意味着它可以不止一次地遍历相同的节点路径。事实上,这个算法可能根本找不到解决方案,这意味着您必须定义一个截止点以防止算法无限搜索。这种方法的一个优点是内存效率高。 |
黑客地球 | 分而治之 | 这是一个解决问题的技巧,将问题分解成尽可能小的部分,并使用最简单的方法解决。与其他方法相比,这种技术节省了大量的时间和资源,比如暴力。但是,它并不总是保证最佳结果。 |
可汗学院 | Dijikstra | 这是一个算法,用于查找有向权重(具有正权重)图的最短路径。 |
极客极客 | 图 | 图是一种树扩展。和树木一样,你有相互连接的节点来建立关系。但是,与二叉树不同,一个图可以有多个或两个连接。事实上,图形节点往往有很多连接。你可以看到在GPS地图等地方使用的图形,以及树的自顶向下的方法无法工作的各种其他地方。 |
教程 | 贪婪算法 | 这个解决问题的方法之一是解决方案依赖于解决问题的每一步的最佳答案。贪婪算法通常做两个假设: |
|
在给定的步骤中做出单一的最佳选择是可能的。通过在每个步骤中选择最佳选择,可以为整个问题寻找最佳解决方案。 | 教程 |
贪婪最佳搜索(BFS) | 算法通常使用以下公式选择最接近目标的路径: | f(n) |
= | h n)的
。这个特定的算法可以很快地找到解决方案,但也可能陷入循环,所以很多人不认为这是找到解决方案的最佳方法。
Centurion2 哈希 |
这是一种在实际查找数据结构(无论结构可能是什么)之前预测特定数据项的位置的方法。这种方法依赖于使用放置在索引中的键。哈希函数将密钥转换为算法放入哈希表的数值。哈希表提供了创建指向数据结构中元素的索引的方法,以便算法可以轻松地预测数据的位置。 |
教程 | 堆 这是一个复杂的树,允许将数据插入到树结构中。数据插入的使用使排序更快。您可以进一步将这些树分类为最大堆和最小堆,具体取决于树立即提供树中最大值或最小值的能力。 启发式 这是一种解决问题的技术,它依赖于自我发现,并产生足够有用的结果(不一定是最优的,但足够好)来解决问题,必要的。自我发现是允许算法向您展示解决方案的潜在有用途径的过程(但是您必须依靠人类的直觉和理解来了解解决方案是否正确)。 西北。 edu | MapReduce |
这是一个使算法并行使用计算(使用网络中连接在一起的多台计算机)的框架,允许算法更快地完成他们的解决方案。 | Hadoop Apache | Mergesort |
Mergesort是一种通用的基于比较的数据排序方法。这取决于分而治之的方法来执行任务。 | 极客极客 | 纳什均衡 |
这是一个博弈论,其他参与者知道其他参与者的均衡策略,所以没有人通过改变他或她的个人策略获得任何收益。这个理论认为,在任何敌对的情况下,玩家必须考虑所有其他玩家为了赢得比赛而做出的决定。 | Khan Academy | PageRank |
普林斯顿。 edu | 纯启发式搜索 | 该算法按照成本的顺序扩展节点。它维护两个名单。关闭的列表包含已经探索的节点,而打开的列表包含了它必须探索的节点。在每次迭代中,算法以尽可能低的成本扩展节点。所有的子节点都放在封闭的列表中,并计算出各个子节点的成本。该算法以低成本将子节点发送回打开列表,并以高成本删除子节点。因此,该算法对解决方案执行智能的,基于成本的搜索。 |
计算世界 | Quicksort | 这是一种通用的排序策略,基于将数据分割成更小的阵列。这取决于分而治之的方法来执行任务。 |
教程 | 不平衡树 | 这是一棵树,可以在树中放置新的数据项,而不考虑平衡。这种添加项目的方法使得构建树更快,但是在搜索或排序时降低了访问速度。 |
Quora | 将算法与其他数学结构区分 | 如果你像大多数人一样,当涉及到数学结构时,你经常会发现自己头脑发热,因为似乎没有人知道如何正确使用这些术语。就好像人们故意试图让事情变得困难一样!毕竟,什么是方程,为什么它不同于算法?那么,不要害怕:下表为数学结构提供了权威性的指导,您可能会遇到但不敢问的问题。 |
结构 | 说明 | 方程 |
当整体考虑时,数字和符号等同于特定值。公式总是包含一个等号,以便您知道数字和符号代表等号另一边的特定值。方程通常包含以符号形式表示的可变信息,但不要求使用变量。 | 公式 | 用于表示信息或想法的数字和符号的组合。一个公式通常呈现数学或逻辑概念,例如定义两个整数的最大公约数(GCD)(可汗学院的视频讲述这是如何工作的)。通常,公式显示了两个或更多个变量之间的关系。大多数人将公式视为一种特殊的等式。 |
算法 | 用于解决问题的一系列步骤。该序列提供了通过提供特定解决方案解决问题的独特方法。算法不需要表示数学或逻辑概念,即使本书中的演示文稿经常属于这一类,因为人们通常以这种方式使用算法。一些特殊的公式也是算法,如二次公式。对于表示算法的过程,它必须如下: | 有限: |
算法必须最终解决问题。
定义明确:
一系列步骤必须精确,并提出可以理解的步骤,特别是通过计算机,这些计算机必须能够创建可用的算法。 | 生效: |
一个算法必须解决某人定义它的所有问题。一个算法应该总是解决它必须解决的问题。即使您应该预料到一些失败,失败的发生率也很少,只有在预期的算法使用可接受的情况下才会发生。 | 使用算法的惊人方法 |
人们实际上始终使用算法。举个例子,做吐司就是一个算法的例子,正如本篇博文中所解释的那样。做吐司并不是一个惊人的算法,但下表中使用计算机执行任务的算法是。 | 任务 |
为什么这是惊人的 | 加密
保持数据安全是与黑客不断攻击数据源的持续战斗。算法使您能够分析数据,将其放入其他形式,然后稍后将其恢复为原始形式。 图表分析 确定两点之间最短线的能力可以找到各种用途。例如,在一个路由问题中,如果没有这个特定的算法,你的GPS将无法工作,因为它不可能用你从A点到B点的最短路线指引你沿着城市的街道。 伪随机数的产生 想象一下玩游戏从来没有变化。你从同一个地方开始,每次玩的时候都以相同的方式执行相同的步骤。无聊!如果没有生成看似随机数的能力,许多计算机任务变得毫无意义或不可能。 调度 |
使资源的使用对所有相关方而言都是公平的,这也是算法大大提高其存在的另一种方法。例如,交叉点上的定时灯不再是简单的设备,可以倒数灯光变化之间的秒数。现代设备考虑各种问题,如一天的时间,天气条件和交通流量。调度有多种形式,但是。考虑你的电脑如何同时运行多个任务。如果没有调度算法,操作系统可能会获取所有可用的资源,使应用程序无法做任何有用的工作。
搜索
查找信息或验证您所看到的信息是您想要的信息是一项重要任务。如果没有这种能力,你在网上执行的许多任务将不可能,例如在互联网上找到为你的办公室出售完美咖啡壶的网站。 | 排序 |
确定呈现信息的顺序非常重要,因为现在大多数人都受到信息过载的困扰,需要减少数据的浪涌。想象一下,去亚马逊,找到超过一千个咖啡壶出售,但不能根据价格或最正面的评论来分类。而且,许多复杂的算法需要数据按照正确的顺序工作,所以排序是解决更多问题的重要条件。 | 转换 |
将一种数据转换为另一种数据对于有效理解和使用数据至关重要。例如,你可能会理解皇室的权重,但你所有的来源都使用公制。两个系统之间的转换有助于您理解数据。同样,快速傅里叶变换(FFT)可以在时域和频域之间转换信号,使您的WiFi路由器能够正常工作。 | 处理算法复杂性 |
您已经知道算法是复杂的。但是,您需要知道算法的复杂程度,因为更复杂的算法运行时间越长。下表帮助您理解按运行时间(从最快到最慢)顺序呈现的各种复杂级别。 | 复杂度 |
描述 | 常量复杂度O(1) |
无论您提供多少输入,都提供一个不变的执行时间。每个输入都需要一个单位的执行时间。 | 对数复杂度O(log n) |
运算次数以比输入慢的速度增长,使得算法在小输入时效率较低,在较大输入时效率较高。这个类的典型算法是二分查找。 | 线性复杂度O(n) |
操作随输入以1:1的比例增长。一个典型的算法是迭代,当你扫描输入一次,并对其中的每个元素应用一个操作。 | 线性复杂度O(n log n) |
复杂度是对数线性复杂度的一种混合。用于排序数据的一些智能算法是典型的,例如Mergesortsort,Heapsort和Quicksort。
二次复杂度O(n
2 | ) |
操作以输入数量的平方增长。当你在另一个迭代(在计算机科学中称为嵌套迭代)中有一个迭代时,你有二次复杂性。例如,你有一个名字列表,为了找到最相似的名字,你比较每个名字与其他所有的名字。一些效率较低的排序算法呈现出这样的复杂性:冒泡排序,选择排序和插入排序。这种复杂程度意味着您的算法可能会在达到解决方案之前运行数小时甚至数天。 | 立方体复杂度O(n |
3 | ) |
操作的增长速度比二次方复杂性要快,因为现在您有多个嵌套迭代。当算法具有这种复杂性的顺序,并且需要处理适量的数据(100,000个元素)时,算法可能会运行多年。当有多个操作是输入的功能时,通常将该算法称为在多项式时间内运行。 | 指数复杂度O(2 |
n | ) |
对于添加的每个新元素,该算法将采用之前操作次数的两倍。当一个算法具有这种复杂性时,即使是小的问题也可能永远存在许多执行穷举搜索的算法具有指数级的复杂性。然而,这个复杂程度的典型例子是计算斐波纳契数。 因子复杂度O(n!) 由于元素之间可能存在大量的组合,因此该算法呈现出真正的复杂性。想象一下:如果您的输入是100个物体,而您的计算机上的操作需要10 | -6 |
秒(现在每台计算机都有合理的速度),则需要大约10 999 $ 140 年完成任务成功(不可能的时间,因为宇宙的年龄估计为10 999 999年)。一个着名的因素复杂性问题是旅行商问题,在这个问题中,推销员必须找到访问许多城市和回到起始城市的最短路线。
|