
数据结构
TeddyZhangOvO
研究生在读,微信公众号:算法工程师之路
展开
-
左神算法基础:哈希函数和哈希表(C++)
笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你或许就会觉得原来也不过如此啊!其核心就是哈希函数和哈希表的应用!哈希函数哈希函数又称为散列函数,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输...原创 2019-07-04 14:42:53 · 1114 阅读 · 1 评论 -
让你的代码更C++一点(前缀树示例)
文章和资源同步更新至微信公众号:算法工程师之路不知道各位写C++代码的童鞋们,有没有发现一个现象,自己写的CPP代码怎么那么像C代码呢?笔者也深有感触,但是自从C++11标准出现以后,CPP的代码就开始精简很多了,风格也极大的发生了变化,今天笔者就开始整理一些C++的新特性,并展示如何在实际应用中使用!让你的代码更Cpp些!1. nullptrnullptr是为了补充并替代NULL的,由...原创 2019-07-10 16:16:34 · 629 阅读 · 0 评论 -
左神算法基础:布隆过滤器
基础介绍布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。实际工程的应用实际上,布隆过滤器广泛应用于网页黑名单系统、垃圾邮件过滤系统、爬虫网址判重系统等,有人会想,我直接...原创 2019-07-05 16:55:17 · 1232 阅读 · 0 评论 -
堆结构和lambda表达式的应用(IPO问题)
之前有篇文章讲解了堆结构以及堆排序,堆可以分为大根堆和小根堆,那么我们如何使用么?笔试时需不需要自己重新实现一个堆结构呢?这个问题怎么说,从底层实现是应该会的,也不难,但实际用的时候就不用自己重新造轮子了!C++标准库中有类似堆结构的东西——Priority_Queue!lambda表达式()段落来源转自简书–小白将在开始今天的内容之前,我们先来说一说C++中的lambda表达式,大家学...原创 2019-07-11 15:46:20 · 412 阅读 · 0 评论 -
面试中的排序算法(Part 1)
昨天由于mood not good,所以缺勤一天,今天满血复活,开始更新!在面试中常见的常见的排序算法有冒泡排序、选择排序、插入排序、归并排序、随机快排、堆排序和希尔排序这七种方式!虽然冒泡排序和选择排序基本上已经没有人使用了,但这种教科书式的思维还是值得学习的!我们接下来就来谈谈这几种排序算法的优劣!荷兰国旗问题我们把荷兰国旗问题用数组的形式表达一下是这样的:给定一个整数数组,给定一个值...原创 2019-07-07 14:24:39 · 311 阅读 · 0 评论 -
并查集详解和STL中的自定义哈希
文章和资源同步更新至微信公众号:算法工程师之路今天我们要介绍一种简单但对于合并和查找都十分高效的结构——并查集,其底层实现也十分简单,并且应用非常广泛,比如最小生成树算法中的Kruskal算法,里面有使用了并查集的结构!并且在并查集结构为了加速查找,底层使用基于hash的容器,在CPP中,叫做unordered_map! unordered_map是C++11标准的东西,其为基础类型提供了h...原创 2019-07-19 19:09:10 · 466 阅读 · 0 评论 -
开启图结构:图的创建和遍历
今天我们来聊一聊图结构,虽然在面试中图结构用的不多,但是我真的觉得图结构可以综合很多知识点,以及STL中容器的使用,并且需要很强大的逻辑性!是一个锻炼脑子的东西,并且Coding起来非常之爽~~图的建立我们使用算法来模拟图结构之前,需要首先搞清楚图结构都需要什么元素!一般来说我们将一张图定义为G=(V, E),其中集合V表示顶点(nodes),而集合E表示某一对顶点之间的关系,叫做边,如果这...原创 2019-07-20 14:43:03 · 498 阅读 · 0 评论 -
从暴力递归到动态规划
文章和资源同步更新至微信公众号:算法工程师之路在之前的文章大家应该也接触到了一些递归的思想,递归的实质就是函数嵌套着函数,在第一个函数运行中间一定会运行多个函数,因此函数退出条件的设置一定要合理,否则会造成堆栈充满,程序异常退出!那我们今天来看看如何从暴力递归改成动态规划?动态规划的实质又是什么?什么情况下可以让暴力递归改成动态规划?暴力递归和动态规划的区别暴力递归:(自顶向下)...原创 2019-07-26 12:56:03 · 422 阅读 · 0 评论 -
面试中的排序算法(Part 3)
文章和资源同步更新至微信公众号:算法工程师之路今天来谈一种十分重要的堆排序的算法,其在STL中的数据结构也就是Priority_Queue。也是一种十分高效的排序方式,虽然其算法模型为二叉树结构,但是可以使用数据进行模拟这个二叉树的结构和相应的函数操作!大根堆和小根堆堆树的定义如下:堆树是一颗完全二叉树堆树的当前节点总是不大于或者不小于其孩子节点的值,如果不大于其孩子节点,叫做小根...原创 2019-07-09 16:31:07 · 130 阅读 · 0 评论 -
左神算法基础:判断二叉树的类别
昨天的文章讲述了二叉树的先序、中序和后序的遍历方法(递归和非递归),但是这种遍历方法有什么意义么?今天来讲讲这些算法可以用来做什么,只要稍加更改,我们就可以得到另外一个功能,只需要仅仅几行代码的修改!还记得上篇文章二叉树的分类么?今天我们要来说三种树的分类:完全二叉树、平衡二叉树和搜索二叉树!完全二叉树:只有最后一层不需要铺满,其余各层均是满的状态!平衡二叉树:每个节点的左子树和右子树的高度...原创 2019-07-03 18:02:14 · 458 阅读 · 0 评论 -
面试中的排序算法(Part 2)
荷兰国旗问题在说随机快排之前,我们首先要谈一下荷兰国旗问题,这个方法的一个重要拓展就是快排问题!我们把荷兰国旗问题用数组的形式表达一下是这样的:给定一个整数数组,给定一个值K,这个值在原数组中一定存在,要求把数组中小于K的元素放到数组的左边,大于K的元素放到数组的右边,等于K的元素放到数组的中间,最终返回一个整数数组,其中只有两个值,分别是等于K的数组部分的左右两个下标值。比如,给定一个数...原创 2019-07-08 15:13:39 · 223 阅读 · 0 评论 -
Linux下GDB调试
之前写C++的一些程序都是在windows下,直接使用VS2017的傻瓜式编译器,最近尝试摸索在linux进行C++程序的编译,有了一些成果!代码编辑器: VS Code(虽然vim很强大,但我觉得的vim查看和修改少量代码更为适合,编辑整个程序文件还是用VS Code吧)代码编译器: 虽然VS Code有对应的C++插件,还是感觉不舒服,所以笔者还是使用指令在VS Code下方的TERMIN...原创 2019-07-03 11:23:54 · 254 阅读 · 0 评论 -
左神算法基础:两个单向链表的第一个交点
最近听了左神的算法课,对一些常用数据结构以及算法改进的思路有了更深的理解,特此总结,不定期更新算法题目以及答案总结!笔者使用C++进行算法重现!虽然左神使用的是JAVA,但他自己也说了,算法与语言无关,但C++写出来的复杂度过不了,那么用其他的语言JAVA,Python也一定过不了!所以刷题还是尽量C++吧,算法基本用不了什么库函数,顶多几个数据结构,而C++的STL里面都包含。单向链表首先什...原创 2019-07-03 11:43:07 · 554 阅读 · 0 评论 -
左神算法基础:二叉树的遍历
二叉树也是常用的数据结构,通过使用二叉树可以快速的对数据进行排序或者查找,在常用的堆排序算法中,堆的底层实质就是一个模拟的完全二叉树!等等,什么是完全二叉树?二叉树又是什么?有哪几类?让我们开始今天的算法课堂~二叉数的概念和分类二叉树是每个树节点最多有两个子树的一种特殊的树结构,其有一些内在的性质,比如,若二叉树的层次从0开始,则在二叉树的第i层至多有 [公式] 个节点(i>=0),高度...原创 2019-07-03 11:58:25 · 687 阅读 · 0 评论 -
最小生成树(Kruskal和Prim算法)
文章和资源同步更新至微信公众号:算法工程师之路8月份会在公众号开启每日算法题,值得期待哦~上一篇文章,我们讲了图的创建和遍历,其中遍历的算法主要有BFS(广度优先算法)和DFS(深度优先算法)两种,并且DFS算法对很多问题都有很好的启示!而今天我们要说一个非常实用的算法——最小生成树的建立!这是图论中一个经典问题,可以使用Kruskal和Prim两种算法来进行实现!什么是最小生成树在给...原创 2019-07-23 11:13:30 · 404 阅读 · 0 评论