
数据结构与算法
KassadinSw
songwei0709@buaa.edu.cn
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[一步步学数据结构与算法 01]-如何学习数据结构与算法?
数据结构是什么:数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。数据结构是为算法服务的,算法是要作用再特定的数据结构上的。需要学什么:效率和资源消耗的度量衡–复杂度分析。最常用、最基础的20个数据结构与算法,学习他们的:“来历”、“特点”、“适合解决什么问题”和“实际的应用场景”。数据结构:数组、链表、栈、队列、散列表、二叉树‘、堆、跳表、图、Tire树算法...原创 2018-09-24 16:22:00 · 660 阅读 · 0 评论 -
[一步步学数据结构与算法 12]-排序(下)
三、快速排序1.算法原理快排的思想是这样的:如果要排序数组中下标从p到r之间的一组数据,我们选择p到r之间的任意一个数据作为pivot(分区点)。然后遍历p到r之间的数据,将小于pivot的放到左边,将大于pivot的放到右边,将povit放到中间。经过这一步之后,数组p到r之间的数据就分成了3部分,前面p到q-1之间都是小于povit的,中间是povit,后面的q+1到r之间是大于povit...原创 2019-07-24 10:00:28 · 258 阅读 · 0 评论 -
[一步步学数据结构与算法 15]-二分查找(上)
一、什么是二分查找?二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。二、时间复杂度分析?1.时间复杂度假设数据大小是n,每次查找后数据都会缩小为原来的一半,最坏的情况下,直到查找区间被缩小为空,才停止。所以,每次查找的数据大小是:n,n/2,n/4,…,n/(2k),…,这是一个等比数列。当n/(2k...原创 2019-07-29 09:39:49 · 243 阅读 · 1 评论 -
[一步步学数据结构与算法 16]-二分查找(下)
一、四种常见的二分查找变形问题1.查找第一个值等于给定值的元素public int bsearch(int[] a, int n, int value) { int low = 0; int high = n - 1; while (low <= high) { int mid = low + ((high - low) >> 1); if (a...原创 2019-07-29 16:32:55 · 224 阅读 · 0 评论 -
[一步步学数据结构与算法 17]-跳表
一、什么是跳表?为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引的数据结构就称为跳表。二、跳表的时间复杂度?1.计算跳表的高度如果链表有n个节点,每2个节点抽取抽出一个节点作为上一级索引的节点,那第1级索引的节点个数大约是n/2,第2级索引的节...原创 2019-07-30 09:34:41 · 425 阅读 · 0 评论 -
[一步步学数据结构与算法 13]-线性排序
一、线性排序算法介绍1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法的时间复杂度为O(n)。3.此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。4.对排序数据的要求很苛刻,重点掌握此3种排序算法的适用场景。二、桶排序(Bucket sort)1.算法原理:1)将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行快速排序。2)桶内排完序之后,再...原创 2019-07-25 13:09:46 · 173 阅读 · 0 评论 -
[一步步学数据结构与算法 20]-哈希算法(上)
带着问题来学习:1.如何防止数据库中的用户信息被脱库?2.你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗?3.在实际开发中,我们应该如何用哈希算法解决问题?一、什么是哈希算法?1.定义将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。2.如何设计一个优秀的哈希算法?①单向哈希:...原创 2019-08-03 09:46:09 · 543 阅读 · 0 评论 -
[一步步学数据结构与算法 18]-散列表(上)
一、散列表的由来?1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。3.将数据存储在散列值对应的数组下标位置。二、如何设计散列函数?总结3点设计散列函数的基本要求1.散列函数计算得到的散列值是一个非负整数。2.若key1...原创 2019-07-31 09:31:54 · 207 阅读 · 0 评论 -
[一步步学数据结构与算法 14]-排序优化
一、如何选择合适的排序算法?1.排序算法一览表2.为什选择快速排序?1)线性排序时间复杂度很低但使用场景特殊,如果要写一个通用排序函数,不能选择线性排序。2)为了兼顾任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数。3)同为O(nlogn)的快排和归并排序相比,归并排序不是原地排序算法,所以最优的选择是快排。二、如何优化快速排序?导致快排时间复杂度...原创 2019-07-26 13:25:28 · 179 阅读 · 0 评论 -
[一步步学数据结构与算法 18]-散列表(中)
面试题目:如何设计一个工业级的散列函数?思路:何为一个工业级的散列表?工业级的散列表应该具有哪些特性?结合学过的知识,我觉的应该有这样的要求:1.支持快速的查询、插入、删除操作;2.内存占用合理,不能浪费过多空间;3.性能稳定,在极端情况下,散列表的性能也不会退化到无法接受的情况。方案:如何设计这样一个散列表呢?根据前面讲到的知识,我会从3个方面来考虑设计思路:1.设计一个合适的散...原创 2019-08-01 09:30:02 · 167 阅读 · 0 评论 -
[一步步学数据结构与算法 21]-哈希算法(下)
1.负载均衡1.1.需求如何实现一个会话粘滞(session sticky)的负载均衡算法?也就是说,在一次会话中的所有请求都路由到同一个服务器上。1.2.解决方案通过哈希算法对客户端IP或会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。这样,就可以把同一个IP过来的请求都路由到同一个后端服务器上。2.数据分片2.1.如何统计...原创 2019-08-05 16:35:20 · 202 阅读 · 0 评论 -
[一步步学数据结构与算法 11]-排序(上)
一、排序方法与复杂度归类(1)几种最经典、最常用的排序方法:冒泡排序、插入排序、选择排序、快速排序、归并排序、计数排序、基数排序、桶排序。(2)复杂度归类冒泡排序、插入排序、选择排序 O(n^2)快速排序、归并排序 O(nlogn)计数排序、基数排序、桶排序 O(n)二、如何分析一个“排序算法”?<1>算法的执行效率最好、最坏、平均情况时间复杂度。时间复杂度的系数、...原创 2018-10-17 10:06:42 · 298 阅读 · 0 评论 -
合并两个有序链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如下图中的链表1和链表2,则合并之后的升序链表如链表3所示。注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3.首先分析合并两个链表的过程。我们的分析从合并两个链表的头结点开始。链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点将是合并后链表的头结点。如下图所示。 链...原创 2018-10-10 15:40:25 · 516 阅读 · 0 评论 -
[一步步学数据结构与算法 02] - 算法学习思维导图
原创 2018-09-24 16:29:32 · 330 阅读 · 0 评论 -
[一步步学数据结构与算法 05]-数组
数组看起来简单基础,但是很多人没有理解这个数据结构的精髓。带着为什么数组要从0开始编号,而不是从1开始的问题,进入主题。原创 2018-10-02 15:53:12 · 306 阅读 · 0 评论 -
[一步步学数据结构与算法 03]-时间与空间复杂度(上)
一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。二、为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高...原创 2018-09-26 19:04:24 · 519 阅读 · 0 评论 -
[一步步学数据结构与算法 09]-队列
一、什么是队列?1.先进者先出,这就是典型的“队列”结构。2.支持两个操作:入队enqueue(),放一个数据到队尾;出队dequeue(),从队头取一个元素。3.所以,和栈一样,队列也是一种操作受限的线性表。二、如何实现队列?1.队列APIpublic interface Queue<T> {public void enqueue(T item); //入队publi...原创 2018-10-12 16:32:35 · 218 阅读 · 0 评论 -
[一步步学数据结构与算法 10]-递归
一、什么是递归?1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。2.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。3.基本上,所有的递归问题都可以用递推公式来表示,比如f(n) = f(n-1) + 1;f(n) = f(n-1) + f(n-2);f(n)=n*f(n-1);二、为什么使用递...原创 2018-10-12 16:38:03 · 260 阅读 · 0 评论 -
[一步步学数据结构与算法 06]-链表(上)
一、什么是链表?1.和数组一样,链表也是一种线性表。2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。二、为什么使用链表?即链表的特点1.插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低O(...原创 2018-10-06 16:25:33 · 341 阅读 · 0 评论 -
[一步步学数据结构与算法 07]-链表(下)
一、理解指针或引用的含义1.含义:将某个变量(对象)赋值给指针(引用),实际上就是就是将这个变量(对象)的地址赋值给指针(引用)。2.示例:p—>next = q; //表示p节点的后继指针存储了q节点的内存地址。p—>next = p—>next—>next;// 表示p节点的后继指针存储了p节点的下下个节点的内存地址。二、警惕指针丢失和内存泄漏(单链表)1...原创 2018-10-06 16:48:23 · 331 阅读 · 0 评论 -
反转链表的算法实现
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。下面给出了链表结点的定义:struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};分析: 链表前后元素的关联就是通过指针实现...原创 2018-10-07 16:09:08 · 404 阅读 · 0 评论 -
[一步步学数据结构与算法 04]-时间与空间复杂度(下)
一、复杂度分析的4个概念1.最坏情况时间复杂度:代码在最理想情况下执行的时间复杂度。2.最好情况时间复杂度:代码在最坏情况下执行的时间复杂度。3.平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。4.均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低...原创 2018-09-29 14:19:27 · 212 阅读 · 0 评论 -
[一步步学数据结构与算法 08]- 栈
一、什么是栈?1.后进者先出,先进者后出,这就是典型的“栈”结构。2.从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。二、为什么需要栈?1.栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现。2.但,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。3.所以,当某个数据集合只涉及在...原创 2018-10-08 19:15:46 · 367 阅读 · 0 评论 -
[一步步学数据结构与算法 19]-散列表(下)
带着问题去学习:1.为什么散列表和链表经常放在一起使用?2.散列表和链表如何组合起来使用?一、为什么散列表和链表经常放在一起使用?1.散列表的优点:支持高效的数据插入、删除和查找操作2.散列表的缺点:不支持快速顺序遍历散列表中的数据3.如何按照顺序快速遍历散列表的数据?只能将数据转移到数组,然后排序,最后再遍历数据。4.我们知道散列表是动态的数据结构,需要频繁的插入和删除数据,那么每...原创 2019-08-02 09:31:01 · 299 阅读 · 0 评论