直观:说说简单的算法

优采云 发布时间: 2022-11-01 22:15

  直观:说说简单的算法

  算法介绍

  算法是由解决问题所需的步骤形成的解决方案,每个步骤包括一个或多个操作。无论是在现实生活中还是在计算机中,可能有很多方法可以解决同一个问题。在这N种算法中,一定有一种执行效率最快的方法,那么这个方法就是最优算法。

  整理:Gopher 文档:

  算法有五个基本特征:输入、输出、有限性、确定性和可行性。

  进入

  一个算法有零个或多个输出。为了描述操作数的初始情况,所谓0输入是指算法本身定义了初始条件。

  输出

  一种算法至少有一个输出。换句话说,算法必须有一个输出。输出可以是打印形式,也可以是返回一个值或多个值等,还可以显示一些提示。

  有限性

  算法的执行步骤是有限的,算法的执行时间也是有限的。

  肯定

  算法的每一步都有明确的含义,没有歧义。

  可行性

  算法是可用的,即能够解决当前问题。

  算法设计要求:

  正确性

  对于合法的输入,算法可以处理非法的处理,得到合理的结果。该算法对边界数据和压力数据均能获得满意的结果。

  可读性

  算法应该易于阅读、理解和交流。只有自己能理解,没有人能理解。有什么好的算法。

  稳健性

  通俗地说,一个好的算法应该具有捕获/处理异常的能力。此外,该算法应该能够轻松处理测试人员的压力测试和边界值测试等困难的测试方法。

  具有成本效益

  用最少的时间和资源获得满足要求的结果,可以通过(时间复杂度和空间复杂度)来确定。

  通常,可以通过事后统计和事前分析来估计算法的效率。

  post-hoc统计方法的缺点:必须编写相应的测试程序,严重依赖硬件和运行环境,算法采集的数据比较困难。

  分析前估计:主要取决于问题的大小。

  这里解释了时间复杂度和空间复杂度。

  时间复杂度:

  时间复杂度是对排序数据的操作总数。它反映了n变化时操作次数的规律性。

  

  公式:T(n) = O( f(n) ) ,其中 f(n) 是问题大小 n 的函数,n 是执行操作的次数。

  除非另有说明,否则我们分析的时间复杂度是指最差的时间复杂度。

  空间复杂度:

  空间复杂度是算法在计算机中执行所需存储空间的度量,也是数据大小n的函数。

  公式:S(n) = O( f(n) ),其中f(n)是问题大小为n时占用的内存空间大小。

  大 O 表示法也适用于空间复杂度。

  常用算法

  我们都知道线性表分为无序线性表和有序线性表。

  无序线性表的数据不是按升序或降序排列的,所以在插入和删除的时候,没有必须遵守的规则,可以在数据末尾插入,也可以在数据末尾删除(需要删除的数据和上一次数据交换位置),但是查找时需要遍历整个数据集,影响效率。

  有序线性表的数据就是思路。搜索时,由于数据是有序的,可以通过二分法、插值法、斐波那契搜索法来实现。但是插入和删除需要维护一个有序的结构,这会花费很多钱。时间。

  为了提高插入和删除的效率,引入了二叉排序树。

  二叉搜索树 (Balanced Binary Search Tree) 红黑树 (Red-Black Tree) B-Tree 和 B+ 树 (B-Tree)

  二叉搜索树的特点:

  二叉搜索树种最关键的特征是左子树节点必须小于父节点,右子树节点必须大于父节点。

  二叉搜索树搜索:

  通过观察上面的二叉搜索树可以知道,要在树中找到一个值,可以从根节点开始搜索,并与根节点的值进行比较。如果根节点的值大于根节点的值,则在根节点的右子树中查找。其他节点的行为与根节点的行为相同。

  以此为出发点,可以得到递归算法:

  遍历打印可以使用 Inorder Traversal ,打印的结果是一个从小到大的有序数组。

  二叉搜索树插入:

  新节点插入到树的叶子中,完全不改变树中原创节点的组织结构。插入一个节点的成本与查找一条不存在的数据完全相同。

  二进制排序的插入是基于二进制排序的搜索。原因很简单。将节点添加到合适的位置,就是通过搜索找到合适的位置,直接将节点放入其中。

  我们先说一下插入函数。SearchBST中的指针p(BiTree T, int key, BiTree f, BiTree *p)起着非常重要的作用:

  二叉搜索树删除:

  二叉树的删除可以看作是二叉树中最复杂的操作。删除时需要考虑多种情​​况:

  删除的节点是叶子节点 删除只有左子节点的节点 删除只有右子节点的节点 有两个子节点

  二叉搜索树的效率总结:找到最佳时间复杂度O(logN),最差时间复杂度O(N)。插入和删除操作算法简单,时间复杂度与搜索类似。

  平衡二叉搜索树(Height-Balanced Binary Search Tree)是一种二叉排序树,其中每个节点的左子树和右子树的高度差不超过1(小于等于1)。

  二叉树的平衡因子等于节点的左子树深度减去右子树深度的值,称为平衡因子。平衡因子只能是-1,0,1。

  根为离插入节点最近的节点且平衡因子绝对值大于1的子树称为最小不平衡子树。

  

  平衡二叉搜索树是构建二叉树的过程。每当插入一个节点时,看看树的插入是否破坏了树的平衡。如果是这样,找到最小的不平衡树。在保持二叉树特性的前提下,调整最小不平衡子树中节点之间的链接关系,并进行相应的旋转,使其成为新的平衡子树。所以主要是要注意:一步一步调整,一步一步平衡。

  在左右旋转的过程中,我们可以看到平衡因子从(0, 1, 2)变为(0, 0, 0),这是一个将不平衡状态转换为平衡状态的过程,即也是 AVL 树 step 的 step 调整的核心。

  让我们看一个更复杂的情况:

  插入一个新的节点17,使得13的BF(-2)和21的BF(1)符号相反。如果直接向左旋转,调整后的树就不再是二叉排序树了。因此,正确的做法是先在step1中调整符号,然后在step2中进行平衡操作。

  由此可以总结出平衡运算中非常必要的符号统一运算:

  最小不平衡子树的BF和它的子树的BF符号相反时,就需要对结点先进行一次旋转使得符号相同,再 反向旋转一次 才能够完成平衡操作。

  红黑树是一种自平衡二叉搜索树,一种用于计算机科学的数据结构,通常用于实现关联数组。它由 Rudolf Bell 于 1972 年发明,被称为“对称二叉 B 树”,其现代名称来源于 Leo J. Guibas 和 Robert Sedgewick 1978 年的一篇论文。红黑树的结构很复杂,但它的操作具有良好的最坏情况运行时间,并且在实践中效率很高:它可以在 O(log n) 时间内执行查找、插入和删除操作,其中 n 是数字树中元素的数量。

  AB/B+树是一个N-ary平衡树。每个节点可以有更多的子节点,并且可以在不改变树高度的情况下将新值插入现有节点。平衡和数据迁移的次数,非常适合数据库索引等需要持久化在磁盘上,需要大量查询和插入操作的应用。

  红黑树的用途和好处:

  红黑树,如 AVL 树,为插入时间、删除时间和查找时间提供了最好的最坏情况保证。这不仅使它们在时间敏感的应用程序(例如实时应用程序)中有价值,而且使它们在提供最坏情况保证的其他数据结构中作为基本模板也很有价值;例如,在计算几何中,许多使用的数据结构都可以基于红黑树来实现。

  红黑树在函数式编程中也特别有用,它们是最常用的持久性数据结构之一,它们用于构造在每次插入或删除版本后保持不变的关联数组和集合。除了 O(log n)} 时间之外,红黑树的持久化版本每次插入或删除都需要 O(log n) 空间。

  红黑树相当于 2-3-4 树。换句话说,对于每棵2-3-4树,至少有一棵红黑树,其数据元素的顺序相同。2-3-4树上的插入和删除操作也相当于红黑树上的颜色翻转和旋转。这使得 2-3-4 树成为理解红黑树背后逻辑的重要工具,这也是为什么很多介绍算法的教科书在红黑树之前介绍 2-3-4 树,虽然 2-3-4 树不是实践中经常使用。

  与AVL树相比,红黑树在插入或删除操作时牺牲了部分平衡来换取少量的旋转操作,整体性能优于AVL树。

  红黑树属性:

  红黑树是一种二叉搜索树,其中每个节点都有一个颜色属性,红色或黑色。除了执行二叉搜索树的一般要求。树中的一个节点收录 5 个属性:颜色、键、左、右和 p。如果一个节点没有子节点或父节点,则该节点对应的指针属性值为NIL。

  红黑树要求:

  节点为红色或黑色。根是黑色的。所有叶子都是黑色的(叶子是 NIL 节点)。每个红色节点必须有两个黑色孩子。(从每个叶子到根的所有路径不能有两个连续的红色节点。)从任何节点到每个叶子的所有简单路径都收录相同数量的黑色节点。

  这些约束确保了红黑树的关键属性:从根到叶的最长可能路径不超过最短可能路径的两倍。结果是树大致平衡。因为插入、删除和查找值等操作的最坏情况时间需要与树的高度成正比,所以这个高度的理论上限允许红黑树在最坏情况下有效,不同于普通的二叉搜索树。

  要了解为什么这些属性确保了这个结果,只需注意属性 4 导致路径不能有两个相邻的红色节点这一事实就足够了。最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。由于根据属性 5,所有最长路径都具有相同数量的黑色节点,这意味着任何路径的长度都不能超过任何其他路径的两倍。

  在许多树数据结构的表示中,一个节点可能只有一个子节点,叶子节点收录数据。可以用这种范式表示一棵红黑树,但这会改变一些属性并使算法复杂化。为此,我们在本文中使用“零叶子”或“空叶子”,如上图所示,其中不收录任何数据,仅作为树到此结束的指示。这些节点经常从图中省略,导致树看起来与上述原则相矛盾,而实际上它们并非如此。与此相关的结论是所有节点都有两个孩子,尽管其中一个或两个可能是空叶子。

  与 BST 和 AVL 树相比,红黑树有哪些优势?

  红黑树牺牲了严格高度平衡的优势,只需要部分平衡,减少了对旋转的要求,从而提高了性能。

  红黑树可以执行 O(log2 n) 时间复杂度的搜索、插入和删除操作。此外,由于其设计,任何不平衡都可以在三转内解决。当然,还有一些更好但更复杂的数据结构可以实现,可以在一次旋转中达到平衡,但是红黑树可以给我们一个相对“便宜”的解决方案。

  与BST相比,由于红黑树可以保证树的最长路径不大于最短路径长度的两倍,可见其搜索效果的保证最低。在最坏的情况下也保证为 O(logN),这比二叉搜索树要好。因为二叉搜索树最坏情况可以使搜索达到O(N)。

  红黑树的算法时间复杂度和AVL树一样,但是统计性能比AVL树要高,所以插入和删除的后期维护操作肯定会比AVL树长很多红黑树,但它们的搜索效率是一样的。是O(logN),所以红黑树的应用还是高于AVL树的。事实上,插入的速度,AVL树和红黑树取决于你插入的数据。如果你的数据分布比较好,用AVL树(比如随机序列号)比较合适,但是如果你想处理比较乱的,红黑树比较快。

  红黑树的应用:

  支持添加和删除操作实现单个链表反转实现两个有序链表组合成一个有序链表实现链表的中间节点用数组实现链式栈用链表编程模拟实现浏览器的前进和后退功能用数组实现顺序队列用链表实现链式队列实现循环队列编程实现斐波那契数列求值f(n)=f(n-1)+f( n-2) 编程找到阶乘 n! 编程实现一组数据集的全排列实现归并排序、快速排序、插入排序、冒泡排序、选择排序编程实现 O(n) 时间复杂度以找到一组数据的第 K 个最大元素 实现有序数组的二分查找算法 实现模糊二分查找算法(例如大于或等于给定值的第一个元素) 基于链表方法实现哈希表解决冲突问题实现LRU缓存消除算法实现字符集只收录a到z的26个英文字母Trie树实现简单的字符串匹配算法实现二分查找树,并支持插入、删除和搜索操作,在二叉搜索树中找到一个节点的后继节点和前驱节点。层遍历实现了一个小顶堆、一个大顶堆和一个优先级队列来实现堆排序。使用优先队列合并K个有序数组,找出一组动态数据集的最大Top K。实现有向图、无向图和加权图,无权图的邻接矩阵和邻接表表示方法实现图的深度优先搜索,广度优先搜索实现Dijkstra算法,A*算法实现Kahn算法拓扑排序,DFS算法使用回溯算法解决八皇后问题。使用回溯算法求解0 -1 背包问题 使用分治算法求一组数据的一个序列引用的最长递增子序列的逆对数 无权图的邻接矩阵和邻接表表示方法实现图的深度优先搜索,广度优先搜索实现Dijkstra算法,A*算法实现拓扑排序的Kahn算法,DFS算法使用回溯解决八皇后问题的算法。使用回溯算法求解0 -1 背包问题 使用分治算法求一组数据的一个序列引用的最长递增子序列的逆对数 无权图的邻接矩阵和邻接表表示方法实现图的深度优先搜索,广度优先搜索实现Dijkstra算法,A*算法实现拓扑排序的Kahn算法,DFS算法使用回溯解决八皇后问题的算法。使用回溯算法求解0 -1 背包问题 使用分治算法求一组数据的一个序列引用的最长递增子序列的逆对数 而DFS算法使用回溯算法来解决八皇后问题。使用回溯算法求解0 -1 背包问题 使用分治算法求一组数据的一个序列引用的最长递增子序列的逆对数 而DFS算法使用回溯算法来解决八皇后问题。使用回溯算法求解0 -1 背包问题 使用分治算法求一组数据的一个序列引用的最长递增子序列的逆对数

  直观:数据采集需要符合几个方面?

  

  优采云采集器是一种网站采集器,它会自动采集云中的相关文章,并根据用户提供的关键词发布到用户的网站。它可以自动识别各种网页上的标题、正文等信息,不需要用户编写任何采集规则即可实现全网采集。采集内容后,自动计算内容与设定关键词的相关性,只向用户推送相关文章。支持标题前缀、自动加粗关键词、插入永久链接、自动提取标签标签、自动内部链接、自动映射、自动伪原创、内容过滤和替换、电话号码和URL清理、定时采集、百度主动提交等一系列SEO功能。用户只需设置关键词和相关要求,即可实现完全托管、零维护网站内容更新。无限数量的网站,无论是单网站还是*敏感*字*站群,都可以非常方便的管理。 【总结】

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线