随笔分类 -  Algorithm

算法
摘要:BF 算法 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法 比如字符串A主串中找是否存在模式串B,就是一位一位的对应匹配。 BF 算法的思想可以用一句话来概括,那就是,我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没 阅读全文
posted @ 2020-08-28 23:46 lswtianliang 阅读(160) 评论(0) 推荐(0)
摘要:4大经典算法问题 如果我们将这四种算法思想分一下类,那贪心、回溯、动态规划可以归为一类,而分治单独可以作为一类,因为它跟其他三个都不大一样。为什么这么说呢?前三个算法解决问题的模型,都可以抽象成我们今天讲的那个多阶段决策最优解模型,而分治算法解决的问题尽管大部分也是最优解问题,但是,大部分都不能抽象 阅读全文
posted @ 2020-08-27 12:24 lswtianliang 阅读(1829) 评论(0) 推荐(0)
摘要:一种非线性表数据结构,无向图,有向图,程序文件依赖问题,还有带权图,它最直观的存储方式二维临接矩阵 广度优先BFS 深度优先DFS 一直往下递推变量,直到遇到visited节点在返回。 总结 广度优先搜索,通俗的理解就是,地毯式层层推进,从起始顶点开始,依次往外遍历。广度优先搜索需要借助队列来实现, 阅读全文
posted @ 2020-08-27 12:18 lswtianliang 阅读(148) 评论(0) 推荐(0)
摘要:散列表,哈希表,hash表,Hashtable 都是同一个概念 1. 散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。 2. 散列函数,即通过一个方法让hash(key)尽可能均匀的分布到预置容器长度内,但几乎不可能避免散列冲突。散列函数的设计 阅读全文
posted @ 2020-08-26 23:44 lswtianliang 阅读(159) 评论(0) 推荐(0)
摘要:1, 树,平时最常用的树就是二叉树(其实也有多叉树),二叉树可以用链表和数组来存储。 2,二叉树,最多只有两个子节点,满二叉树是指叶子节点都在最底层,其余所有节点都有左右2个子节点,他是一种特殊的完全二叉树。 3. 完全二叉树,是指叶子节点都在最底2层,最后一层叶子节点靠左边排列,并且除了最后一层, 阅读全文
posted @ 2020-08-22 15:56 lswtianliang 阅读(357) 评论(0) 推荐(0)
摘要:1.跳表是一种动态的数据结构(往跳表中插入数据时,我们需要不断的更新索引),它可以支持快速的插入、删除、查找功能,甚至可以替换红黑树,但实际使用不多,主要是红黑树出来的比较早,很多系统级别类库已经内置。 2. 一个链表,查找效率是O(n),如果给它建立索引,二级(多级)索引,先在索引里查找,然后在逐 阅读全文
posted @ 2020-08-22 15:28 lswtianliang 阅读(208) 评论(0) 推荐(0)
摘要:1. 二分法查找算法,判断一个数是否在一个有序数组中存在,最快的方法就是二分法,时间复杂度为O(Logn) 2. 利用二分思想,每次与中间数值比较,缩小查找范围。 3. 写好二分查找需要注意,循环条件是low <= high; mid取值最好不用mid=(low+high)/2, 而是用low + 阅读全文
posted @ 2020-08-22 11:58 lswtianliang 阅读(248) 评论(0) 推荐(0)
摘要:桶、基数,计数排序都是针对海量数据的排序方法,时间复杂度为O(n)。 1. 桶排序 顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 桶排序的限制条件。 a.要排序的数据需要 阅读全文
posted @ 2020-08-22 09:21 lswtianliang 阅读(202) 评论(0) 推荐(0)
摘要:1. 排序算法很多,常见的有冒泡/插入/选择 O(n^2)、归并/快速 O(nLogn)、桶排序/计数/基数O(n)。 2. 排序过程中,我们需要考虑算法 a. 原地算法,即不需要额外的空间 b. 是否是稳定的算法, 保持原有的顺序不变。比如按照一个对象的多个属性排序,稳定排序算法更好实现,效率更好 阅读全文
posted @ 2020-08-21 23:18 lswtianliang 阅读(207) 评论(0) 推荐(0)
摘要:1,队列是一种先进先出的数据结构。它一般只有入队和出队的两个操作,队列跟栈一样,也是一种操作受限的线性表数据结构。 2, 队列用于生产者消费者模型,或者资源数量一定的场景,比如线程池,数据库连接池,常见的变形有循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用 阅读全文
posted @ 2020-08-21 09:20 lswtianliang 阅读(142) 评论(0) 推荐(0)
摘要:1. 栈是一种先进后出的,操作受限的数据结构,他只有入栈和出栈两个操作,即push和pop操作。他可以用数组和链表来实现。 2. 为什么函数调用要用“栈”来保存临时变量呢?用其他数据结构不行吗?其实,我们不一定非要用栈来保存临时变量,只不过如果这个函数调用符合后进先出的特性,用栈这种数据结构来实现, 阅读全文
posted @ 2020-08-20 09:42 lswtianliang 阅读(133) 评论(0) 推荐(0)
摘要:1. 链表,常见的有单链表,双向链表,循环链表 2. 双向链表是常见的空间换时间的策略 3. 淘汰缓存的做法一般有几个,一般用链表结构,常见的策略有三种:先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用策 阅读全文
posted @ 2020-08-19 19:05 lswtianliang 阅读(176) 评论(0) 推荐(0)
摘要:1. 是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。所以JS中的Array不是真正意义上的数组,实际上是散列表存储。 2. CPU缓存也有优势,CPU时间是一次读取当前内存,往后多一点的内容,避免频繁与内存交互,效率更高。 3. 为何索引是从0开始的? a. 历史原因, 阅读全文
posted @ 2020-08-19 16:42 lswtianliang 阅读(108) 评论(0) 推荐(0)
摘要:1. 算法中,评判一个算法是否优秀,通常是依靠复杂度的多少来断定的。 2. 复杂度分时间和空间复杂度,用字母大O来表示。 复杂度是指用来分析算法执行效率与数据规模之间的增长关系,常见的复杂度有 O(1), O(n), O(logn) 这里我们对数一般不指定底数,2,3,x都可以,O(nLog n), 阅读全文
posted @ 2020-07-26 21:04 lswtianliang 阅读(175) 评论(0) 推荐(0)
摘要:当我们要谈一个事物/概念的时候,需要问自己三个终极问题--是什么?为什么?怎么样?什么是数据结构和算法数据结构,就是一组数据的存储结构。算法,就是操作数据的一组方法。数据结构是为算法服务的,算法要作用在特定的数据结构之上。为什么需要数据结构和算法来谈谈应用层面的原因。在计算机科学和互联网迅猛发展下, 阅读全文
posted @ 2020-07-26 19:16 lswtianliang 阅读(105) 评论(0) 推荐(0)