摘要: 1. 分治算法 分治算法的核心就是 分而治之 ,也就是将原问题划分为若干个规模更小但结构与原问题相似的子问题,递归地解决这些子问题然后进行合并,就可以得到原问题的解。比如归并排序就是将原数据划分为左右两个部分,然后分别递归对左右两部分排序,排完序后再合并两个有序区间数据即可得到最终整体有序的数据。 阅读全文
posted @ 2019-12-03 22:19 seniusen 阅读(616) 评论(0) 推荐(0) 编辑
摘要: 1. 什么是回溯算法 回溯可以看作是一个搜索问题解的过程,这个过程分为很多个阶段,每一个阶段我们都有很多个选择,但我们不知道选择哪一个,所以就随机选择一个继续进行下一个阶段,如果发现找不到解,就回退到上一个阶段采取另外的选择再继续搜索。 比如之前图的深度搜索问题,我们就是沿着起始顶点一直向下搜索,发 阅读全文
posted @ 2019-12-03 22:12 seniusen 阅读(348) 评论(0) 推荐(0) 编辑
摘要: 求 Top K 的算法主要有基于快速排序的和基于堆的这两种,它们的时间复杂度都为 $O(nlogK)$。借助于分治思想,以及快速排序的区间划分,我们可以做到 $O(n)$ 时间复杂度。具体算法思路如下: 第 1 步,我们将原数据 5 个一组划分为若干个组,最后余下的不足 5 个的额外作为一组,总组数 阅读全文
posted @ 2019-12-03 22:10 seniusen 阅读(571) 评论(0) 推荐(0) 编辑
摘要: 在社交网络中,有一个 "六度分割理论" ,具体是说,世界上任何互不相识的两人,平均只需要六步就能够建立起联系。一个用户的一度连接用户就是他的好友,二度连接用户就是他好友的好友,三度连接用户就是他好友好友的好友。 给定一个用户,如何找出这个用户的所有三度(包括一度、二度和三度)好友关系呢? 1. 什么 阅读全文
posted @ 2019-12-03 22:07 seniusen 阅读(2600) 评论(0) 推荐(0) 编辑
摘要: 几乎所有的编程语言都会提供排序函数,比如 C 语言的 qsort(), C++ STL 中的 sort(),这些排序函数是如何实现的呢? 1. 如何选择合适的排序算法? 如果要实现一个通用的高效率的排序函数,我们应该选择那种排序算法呢? 各种排序算法的特点如下所示。 线性排序算法的时间复杂度比较低, 阅读全文
posted @ 2019-12-03 22:03 seniusen 阅读(641) 评论(1) 推荐(0) 编辑
摘要: 冒泡排序、插入排序、选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据。今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法——归并排序(Merge Sort)和快速排序(Quick Sort),他们都用到了 分治思想 ,非常巧妙。 1. 归并排序(Merge S 阅读全文
posted @ 2019-12-03 21:58 seniusen 阅读(1318) 评论(0) 推荐(0) 编辑
摘要: 1. 何为数据结构?何为算法? 简单来说,数据结构就是数据的存储方式,比如数组就是把数据存在一段连续的内存上,而链表则是通过指针的关联将数据存在任意可用的内存上;栈是先进后出,队列是先进先出。 而算法则是对这些数据的操作方法,比如数据的插入、查找、删除、排序等。 二者相辅相成,互为一体,数据结构为算 阅读全文
posted @ 2019-12-03 21:54 seniusen 阅读(595) 评论(0) 推荐(0) 编辑
摘要: 1. 题目 2. 解答 在 "回溯算法" 中我们介绍了一种递归的思路来求解这个问题。 此外,这个问题也可以用动态规划的思路来解决。我们定义状态 $P[i][j]$ 为子串 $s[0, i)$ 和 $p[0, j)$ 是否匹配,能匹配为真,反之为假,然后状态转移方程则可以分为以下三种情况: 1. 如果 阅读全文
posted @ 2019-12-03 21:49 seniusen 阅读(195) 评论(0) 推荐(0) 编辑