算法
Cenergy
这个人很懒,以至于这句话都
展开
-
算法学习0
数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法.数据结构是为算法服务的,算法要作用在特定的数据结构之上。比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树;10个算法:递归、排序、二分查...原创 2018-10-29 13:59:49 · 178 阅读 · 0 评论 -
Trie树的实现
在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。Trie这个术语来自于retrieval。根据词源学,...原创 2018-12-18 16:41:20 · 1223 阅读 · 0 评论 -
并查集的实现与优化
并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(union-find algorithm)定义了两个用于此数据结构的操作:Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。Union:将两个子集合并成同一个集合。由于支持这两种操作,一个不相交集也常被称为联合-查找数据结构(union-find da...原创 2018-12-19 09:56:39 · 2026 阅读 · 0 评论 -
LeetCode24.交换链表中的节点
24.交换链表中的节点给定链表,交换每两个相邻节点并返回其头部。例:给定1-> 2-> 3-> 4,您应该将列表返回为2-> 1-> 4-> 3。注意:您的算法应该只使用恒定的额外空间。您可能无法修改列表节点中的值,只能更改节点本身。第一种class Solution(object): def swapPairs(self, head)...原创 2019-01-04 18:16:51 · 148 阅读 · 0 评论 -
Leetcode237.删除链接列表中的节点
237.删除链接列表中的节点编写一个函数来删除单链表中的节点(尾部除外),只允许访问该节点。Example 1:Input: head = [4,5,1,9], node = 5Output: [4,1,9]Explanation: You are given the second node with value 5, the linked list should become 4 -...原创 2019-01-05 10:37:05 · 349 阅读 · 0 评论 -
归并排序
归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 O(nlogn)O(nlog n)O(nlogn) 。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。概述采用 divide-and-conquer approach:Divide:...翻译 2019-01-11 10:04:02 · 197 阅读 · 0 评论 -
二叉堆
什么是二叉堆?二叉堆本质上是一种完全二叉树,它分为两个类型:1.最大堆2.最小堆什么是最大堆呢?最大堆任何一个父节点的值,都大于等于它左右孩子节点的值。相反,最小堆就是任何一个父节点的值,都小于等于它左右孩子节点的值。二叉堆的根节点叫做堆顶。最大堆和最小堆的特点,决定了在最大堆的堆顶是整个堆中的最大元素;最小堆的堆顶是整个堆中的最小元素。堆的自我调整对于二叉堆,如下有几种操作:插...原创 2019-01-02 13:33:28 · 202 阅读 · 0 评论 -
二叉堆的应用
二叉堆的应用有一个无序数组,要求你找出数组中第k大的元素。给定的无序数组如下:75153172202419128如果 k=6,也就是要寻找第6大的元素,这个元素是哪一个呢?显然,数组中第一大的元素是24,第二大的元素是20,第三大的元素是17 … 第6大的元素是9。7515317220241912843...原创 2019-01-02 13:35:42 · 1097 阅读 · 0 评论 -
二分查找法的实现(Binary Search)
Java// Java implementation of recursive Binary Searchclass BinarySearch { // Returns index of x if it is present in arr[l.. // r], else return -1 int binarySearch(int arr[], int l, int r...原创 2019-01-02 20:39:20 · 855 阅读 · 0 评论 -
哈希表
原创 2018-12-27 14:10:06 · 124 阅读 · 0 评论 -
红黑树
原创 2018-12-27 14:08:37 · 107 阅读 · 0 评论 -
AVL树
原创 2018-12-27 14:04:18 · 117 阅读 · 0 评论 -
算法学习2
今天我们来聊聊“链表(Linked list)”这个数据结构。学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法。缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存、数据库缓存、浏览器缓存等等。缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰...原创 2018-10-31 11:18:48 · 102 阅读 · 0 评论 -
算法1
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。连续的内存空间和相同类型的数据。正是因为这两个限...原创 2018-10-30 17:02:42 · 154 阅读 · 0 评论 -
算法学习2
后进者先出,先进者后出,这就是典型的“栈”结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。事实上,从功能上来说,数组或链表确实可以替代栈,但你要知道,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特...原创 2018-11-01 17:26:29 · 95 阅读 · 0 评论 -
算法学习栈3
先进者先出,这就是典型的“队列”。栈只支持两个基本操作:入栈 push()和出栈 pop()。队列跟栈非常相似,支持的操作也很有限,最基本的操作也是两个:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。所以,队列跟栈一样,也是一种操作受限的线性表数据结构。队列跟栈一样,也是一种抽象的数据结构。它具有先进先出的特性,支持在队尾插入元素,在队头...原创 2018-11-02 16:32:28 · 207 阅读 · 0 评论 -
算法06
冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是 O(n2),比较高,适合小规模数据的排序。今天,我讲两种时间复杂度为 O(nlogn) 的排序算法,归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。归并排序和快速排序都用到了分治思想,非常巧妙。我们可以借鉴这个思想,来解决非排序的问题,比如:如何在 O(n) 的时间复杂度内查找一个无序数组...原创 2018-11-12 21:59:03 · 224 阅读 · 0 评论 -
算法04
广度优先搜索【breadth-first search,BFS】,广度优先搜索能够找出两个东西之间的最短距离。递归本身就是借助栈来实现的,只不过我们使用的栈是系统或者虚拟机本身提供的,我们没有感知罢了。如果我们自己在内存堆上实现栈,手动模拟入栈、出栈过程,这样任何递归代码都可以改写成看上去不是递归代码的样子。排序算法太多了,有很多可能你连名字都没听说过,比如猴子排序、睡眠排序、面条排序等。...原创 2018-11-11 23:06:56 · 206 阅读 · 0 评论 -
算法05
对于一个倒序排列的数组,比如6,5,4,3,2,1,有序度是0;要排序的数组的初始状态是 4,5,6,3,2,1 ,其中,有序元素对有 (4,5) (4,6)(5,6),所以有序度是 3。对于一个完全有序的数组,比如1,2,3,4,5,6,有序度就是n*(n-1)/2,也就是15。我们把这种完全有序的数组的有序度叫作满有序度。关于这三个概念,我们还可以得到一个公式:逆序度 = 满有序度 - 有序度...原创 2018-11-12 13:58:24 · 216 阅读 · 0 评论 -
链表的虚拟头结点
Node node=new Node(e);node.next=head;head=node;等价于head=new Node(e,head);原创 2018-12-03 22:45:23 · 940 阅读 · 0 评论 -
Leetcode112、路径总和
112 、路径总和给定二叉树和求和,确定树是否具有根到叶路径,使得沿路径的所有值相加等于给定的总和。注意: 叶子是没有子节点的节点。例:鉴于以下二叉树,sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ ...原创 2019-01-21 15:28:14 · 219 阅读 · 0 评论