
S3: 查找算法
涛歌依旧
毕业后就职于华为和腾讯
展开
-
大学生读者让我帮找二分查找的bug
优快云的私信太多了,我几乎没时间看。有位大学生读者加了我微信,让我帮找一个二分查找的bug. 其实,通常情况下,我是不接这种活的。找bug这事,没玩没了。其实说实话,二分查找这程序,还真的容易出错。为了检验自己这几年是否退化,我就花10分钟写了一下,自测OK:#include <iostream>using namespace std; int heheda(int a[], int n, int key){ int left = 0; int right .原创 2021-09-12 23:19:45 · 3102 阅读 · 8 评论 -
笔试面试题目:周芷若和并查集
缘来缘起大家周末好,今天来图解一种重要的数据结构:并查集。为什么要聊并查集呢?一是因为它的思路很优美,二是因为它在笔试面试中频繁出现。来看看小米公司的一道面试题目:有 n 个人和 m 对好友关系,如果两个人是直接或间接的好友,则认为他们属于同一个朋友圈,请写程序求出这 n 个人里一共有多少个朋友圈。举例:n=5,m=3,3对好友关系为{{1,2}, {2, 3}, {4, 5}},即1和2是好友,2和3是好友,4和5是好友,则1、2、3属于同一个朋友圈,4、5 属于另一个朋友圈。那么,这5...原创 2021-08-14 15:19:09 · 699 阅读 · 2 评论 -
搜索引擎提示功能的实现(使用trie树)
大家经常使用google, 当输入搜索内容后,有自动提示的功能,节省了时间。那么,这个自动提示功能是怎样实现的呢?关于搜索匹配,我们讲到过哈希表,也简单提到过红黑树,但今天要说的trie树更适合这种场景,因为trie树能实现前缀匹配。 trie树,就是retrieval树,也就是检索的意思,名如其实,我们先来看看trie树的数据结构。与其它数据结构相比,trie树在前缀查找方面,有独特的优势,而且非常快。实际上,大家经常使用的IDE的自动提示功能,也能使用trie树来实现。原创 2020-08-01 08:53:31 · 3069 阅读 · 4 评论 -
哈希表查找的本质
某一天,黄药师、欧阳锋、周伯通、郭靖、洪七公、一灯大师入住酒店,每人一个房间。 江南七怪柯镇恶,要去酒店找郭靖,怎么找呢?线性查找的思路是:逐个房间敲门询问,直到找到郭靖为止。对于初入门编程的人来说,这是最直接的思路,而且好像不容易找到其它思路。 然而,对于稍有点生活常识的人来说,线性查找的思路挺傻的,何不直接找出郭靖所在的房间号,然后直接去这个房间找郭靖呢?原创 2020-08-01 08:51:38 · 3140 阅读 · 3 评论 -
严奶奶说监视哨兵能让顺序查找时间减半! 真的吗?
在严奶奶版的《数据结构》一书中, 严奶奶引用了别的书的观点: 在顺序查找时(设表长>=1000), 引入监视哨兵, 可以减少几乎一半的查询时间。 理论上,引入监视哨兵, 的确可以优化时间。来测试一下, 看看引入监视哨兵的前后对比:#include <iostream>#include <ctime>#include <wi...原创 2018-08-11 11:54:58 · 5089 阅读 · 9 评论 -
map,hash_map和unordered_map效率比较
转载地址:https://blog.youkuaiyun.com/whizchen/article/details/9286557 原理介绍map介绍map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道...转载 2018-08-03 21:53:15 · 14565 阅读 · 4 评论 -
hash table(哈希表)的拉链法程序
哈希表拉链法,简单,直接看代码:#include <iostream>using namespace std;struct Node{ int iData; Node* pNext;};#define N 10typedef Node* HashTable[N]; // 指针数组HashTable hTable;void c...原创 2018-07-29 11:33:38 · 4482 阅读 · 4 评论 -
字符串哈希和哈希表的本质
很多人听到哈希, 是从md5开始的, 比如每一个字符串都有它的md5, 且两个不同字符串的md5值不一样, 而且根据md5值, 是无法求出原来的字符串的。 这就是字符串的哈希。 说白了, 哈希就是满足一定条件的变换, 本质就是变换, 思路简单得很。 在数据结构中, 又有哈希表, 这个是什么玩意儿呢? 对于非计算机专业的我来说, 开始是不太好理解的, 其实思路非常非常简单。 我们来原创 2017-09-23 00:25:15 · 8562 阅读 · 2 评论 -
求数组a[N]中第i(1<=i<=n)小的数(2012年某公司实习生招聘面试试题)
当年, 某公司实习生招聘, 在第一轮面试中, 我遇到这样一个题目: 有10000个互不相同的无序整数, 如何找到数组的median值(也就是说: 有一半数比它小, 另一半数比它大)。 当时, 我傻不愣登地说: 用O(N*lgN)的排序啊, 比如: 快速排序,堆排序, 归并排序, 希尔排序。 然后面试官提示我:只需要找出median, 而你排序却做了大量的无用功, 还有没有原创 2015-06-13 16:21:25 · 7948 阅读 · 4 评论 -
骇人听闻的二分查找(某公司校园招聘笔试试题)(据说只有10%的程序员可以写出没有bug的二分查找)
二分查找思路很简单,但要把程序写对,却很难,有兴趣的话,可以在网上查一下相关资料,下面给出两种常见的错误:(至于具体错误原因,可以分析程序的执行)错误程序1:#include <iostream>using namespace std;int binarySearch(int a[], int n, int key){ int low = 0;...原创 2012-10-24 21:16:06 · 9985 阅读 · 14 评论 -
顺序查找
#include using namespace std;int seqSearch(int a[], int n, int key){ int i = 0; while(i < n && a[i] != key) i++; //跳出循环的条件必然为i等于n或者a[i]等于key if(n == i) //也就是说i为n-1时,a[i]不等于key原创 2012-10-24 19:26:49 · 7843 阅读 · 0 评论 -
哈希表之简易数学原理和简易实现(史上最简单易懂的哈希表介绍)
什么是哈希表呢? 我先不说, 但其思想确实厉害。原创 2014-08-17 15:18:42 · 10762 阅读 · 13 评论