当前位置: 首页 > 编程日记 > 正文

GitHub标星3w+的项目,全面了解算法和数据结构知识

640?wx_fmt=png

作者 | 程序员小吴

来源 | 五分钟学算法(ID: CXYxiaowu)

导语:今天分享一个开源项目,里面汇总了程序员技术面试时需要了解的算法和数据结构知识,并且还提供了相应的代码,目前 GitHub 上标星 35000 star,值得一看。

640?wx_fmt=png

你可以把这个项目的内容当成是一个目录,在面试前快速浏览一遍对你的面试也是有所帮助的!

GitHub 地址:

https://github.com/kdn251/interviews

一、数据结构

  • 栈是元素的集合,其包含了两个基本操作:push 操作可以用于将元素压入栈,pop 操作可以将栈顶元素移除。

  • 遵循后入先出(LIFO)原则。

  • 时间复杂度:

  • 索引: O(n)

  • 搜索: O(n)

  • 插入: O(1)

  • 移除: O(1)

链表

  • 链表即是由节点组成的线性集合,每个节点可以利用指针指向其他节点。它是一种包含了多个节点的、能够用于表示序列的数据结构。

  • 单向链表: 链表中的节点仅指向下一个节点,并且最后一个节点指向空。

  • 双向链表: 其中每个节点具有两个指针 p、n,使得 p 指向先前节点并且 n 指向下一个节点,最后一个节点的 n 指针指向 null。

  • 循环链表:个节点指向下一个节点并且最后一个节点指向第一个节点的链表。

  • 时间复杂度:

  •  索引: O(n)

  •  搜索: O(n)

  •  插入: O(1)

  •  移除: O(1)


队列


  • 队列是元素的集合,其包含了两个基本操作:enqueue 操作可以用于将元素插入到队列中,而 dequeue 操作则是将元素从队列中移除。

  • 遵循先入先出原则 (FIFO)。

  • 时间复杂度:

  • 索引: O(n)

  • 搜索: O(n)

  • 插入: O(1)

  • 移除: O(1)


二叉查找树


  • 二叉搜索树(BST)是一种特殊的二叉树,其任何节点中的值都会大于或者等于其左子树中存储的值并且小于或者等于其右子树中存储的值。

  • 时间复杂度:

  •  索引: O(log(n))

  •  搜索: O(log(n))

  •  插入: O(log(n))

  •  删除: O(log(n))


字典树


字典树,又称基数树或者前缀树,能够用于存储键为字符串的动态集合或者关联数组的搜索树。树中的节点并没有直接存储关联键值,而是该节点在树中的挂载位置决定了其关联键值。某个节点的所有子节点都拥有相同的前缀,整棵树的根节点则是空字符串。


640?wx_fmt=png

线段树


  • 线段树是用于存放间隔或者线段的树形数据结构,它允许快速的查找某一个节点在若干条线段中出现的次数.

  • 时间复杂度:

  • 区间查询: O(log(n))

  • 更新: O(log(n))

640?wx_fmt=png

哈希


  • 哈希能够将任意长度的数据映射到固定长度的数据。哈希函数返回的即是哈希值,如果两个不同的键得到相同的哈希值,即将这种现象称为碰撞。

  • Hash Map: Hash Map 是一种能够建立起键与值之间关系的数据结构,Hash Map 能够使用哈希函数将键转化为桶或者槽中的下标,从而优化对于目标值的搜索速度。

  • 碰撞解决

  • 链地址法(Separate Chaining): 链地址法中,每个桶是相互独立的,包含了一系列索引的列表。搜索操作的时间复杂度即是搜索桶的时间(固定时间)与遍历列表的时间之和。

  • 开地址法(Open Addressing): 在开地址法中,当插入新值时,会判断该值对应的哈希桶是否存在,如果存在则根据某种算法依次选择下一个可能的位置,直到找到一个尚未被占用的地址。所谓开地址法也是指某个元素的位置并不永远由其哈希值决定。

640?wx_fmt=png



  • 图是一种数据元素间为多对多关系的数据结构,加上一组基本操作构成的抽象数据类型。

  • 无向图(Undirected Graph): 无向图具有对称的邻接矩阵,因此如果存在某条从节点 u 到节点 v 的边,反之从 v 到 u 的边也存在。

  • 有向图(Directed Graph): 有向图的邻接矩阵是非对称的,即如果存在从 u 到 v 的边并不意味着一定存在从 v 到 u 的边。



  • 堆是一种特殊的基于树的满足某些特性的数据结构,整个堆中的所有父子节点的键值都会满足相同的排序条件。堆更准确地可以分为最大堆与最小堆,在最大堆中,父节点的键值永远大于或者等于子节点的值,并且整个堆中的最大值存储于根节点;而最小堆中,父节点的键值永远小于或者等于其子节点的键值,并且整个堆中的最小值存储于根节点。

  • 时间复杂度:

  • 访问最大值 / 最小值: O(1)

  • 插入: O(log(n))

  • 移除最大值 / 最小值: O(log(n))


算法


排序

归并排序

  • 归并排序是典型的分治算法,它不断地将某个数组分为两个部分,分别对左子数组与右子数组进行排序,然后将两个数组合并为新的有序数组。

  • 稳定: 是

  • 时间复杂度:

  • 最优时间: O(nlog(n))

  • 最坏时间: O(nlog(n))

  • 平均时间: O(nlog(n))

快速排序

  • 稳定: 否

  • 时间复杂度:

  • 最优时间: O(nlog(n))

  • 最坏时间: O(n^2)

  • 平均时间: O(nlog(n))

640?wx_fmt=gif

图算法

深度优先搜索

  • 深度优先算法是一种优先遍历子节点而不是回溯的算法。

  • 时间复杂度: O(|V| + |E|)

640?wx_fmt=gif

广度优先搜索

  • 广度优先搜索是优先遍历邻居节点而不是子节点的图遍历算法。

  • 时间复杂度: O(|V| + |E|)

640?wx_fmt=gif

拓扑排序

  • 拓扑排序是对于有向图节点的线性排序,如果存在某条从 u 到 v 的边,则认为 u 的下标先于 v。

  • 时间复杂度: O(|V| + |E|)


END

这个开源项目里面还推荐了一些算法练习网站、视频教程、面试宝典、Google、Facebook 等知名公司面试题及解答代码。

最后再补充一下这个开源项目的 GitHub 地址:


https://github.com/kdn251/interviews

(*本文为 AI科技大本营转载文章,转载请联系原作者)


精彩推荐



AI ProCon 2019 邀请到了亚马逊首席科学家@李沐,在大会的前一天(9.5)亲授「深度学习实训营」,通过动手实操,帮助开发者全面了解深度学习的基础知识和开发技巧。

 

640?wx_fmt=png


9大技术论坛、60+主题分享,百余家企业、千余名开发者共同相约 2019 AI ProCon!技术驱动产业,聚焦技术实践,倾听大牛分享,和万千开发者共成长。5折优惠票抢购中!

640?wx_fmt=png


社群福利

扫码添加小助手,回复:大会,加入2019 AI开发者大会福利群,每周一、三、五 更新学习资源、技术福利,还有抽奖活动~

640?wx_fmt=jpeg

推荐阅读  

  • 从ACM班、百度到亚马逊,深度学习大牛李沐的开挂人生

  • 最前沿:堪比E=mc2,Al-GA才是实现AGI的指标性方法论

  • 1万+字原创读书笔记,机器学习的知识点全在这篇文章里

  • 开源之战

  • 别再造假数据了,来试试Faker这个库吧!

  • 国外大神制作的超棒NumPy可视化教程

  • 白话中台战略:中台是个什么鬼?

  • 伟创力回应扣押华为物资;谷歌更新图片界面;Python 3.8.0b3 发布 | 极客头条

  • 沃尔玛也要发币了,Libra忙活半天为他人做了嫁衣?

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢

相关文章:

Shell脚本基础介绍

shell基础简介:编写脚本通常使用某种基于解释器的编程语言。而shell脚本不过就是一些文件,我们能将一系列需要执行的命令写入其中,然后通过shell来执行这些脚本。进入Linux系统(Ubuntu),打开终端Terminal,”$”表示普通…

「小程序JAVA实战」小程序的举报功能开发(68)

转自:https://idig8.com/2018/09/25/xiaochengxujavashizhanxiaochengxudeweixinapicaidancaozuo66-2/ 通过点击举报按钮,跳转到举报页面完成举报操作。 后台开发 获取发布人的userId,videoId,创建者的Id controllerUserControlle…

tar常见文件解压法

2019独角兽企业重金招聘Python工程师标准>>> tar常见文件解压法:.gz - z 小写.bz2 - j 小写.xz - J 大写.Z - Z大写 转载于:https://my.oschina.net/open1900/blog/149238

cookie的作用域

当我们给网站设置cookie时,大家有没有发现在网站的其他域名下也接收到了这些cookie。这些没用的cookie看似不占多少流量,但如果对一个日PV千万的站点来说,那浪费的资源就不是一点点了。因此在设置cookie时,对它的作用域一定要设置…

必看,10篇定义计算机视觉未来的论文

译者 | Major编辑 | 赵雪出品 | AI科技大本营(ID:rgznai100)导语:如果你没能参加 CVPR 2019 , 别担心。本文列出了会上人们最为关注的 10 篇论文,覆盖了 DeepFakes(人脸转换), Facial Recogniti…

有效的rtsp流媒体测试地址汇总

以下是从网上搜集的一些有效的rtsp流媒体测试地址: 1. rtsp://218.204.223.237:554/live/1/0547424F573B085C/gsfp90ef4k0a6iap.sdp 2. rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp 3. rtsp://211.139.194.251:554…

java简单的ID生成器

2019独角兽企业重金招聘Python工程师标准>>> https://www.cnblogs.com/hongdada/p/9324473.html https://github.com/apache/incubator-shardingsphere 转载于:https://my.oschina.net/u/3005325/blog/3006311

安装、设置与启动MySql5.1.30绿色版的方法

1、解压 mysql-noinstall-5.1.30-win32.zip(下载地址http://dev.mysql.com/downloads/mysql/5.1.html)2、在 F 盘建立目录 MySql\MySqlServer5.1\ 3、把解压的内容复制到 F:\MySql\MySqlServer5.1\4、在 F:\MySql\MySqlServer5.1\ 中找 my-large.ini 把它复制成 my.ini5、在…

网页中插入VLC播放器播放rtsp视频流步骤

1. 仿照http://download.csdn.net/detail/haowenxin123456789/8044245 中步骤; 2. 从http://www.videolan.org/vlc/index.html 中下载 vlc-2.2.1-win32.exe 并安装到D:\\ProgramFiles文件夹下; 3. 运行:regsvr32 D:\\ProgramFil…

@程序员,“10倍工程师”都在追这四大AI风向

技术的发展,驱动着产业变革,从而改变着我们的生活方式。当5GAI 时代来临,核心的技术生产力就是开发者:开发者研究前沿的科学创新,推动技术发展,将技术应用于实际场景中。开发者是企业实现商业价值必不可少的…

End Credits

我不知道怎么把他删掉... 今晚WC文艺汇演wwww(等待唱歌.jpg 要是能截到屏一定发上来qwqqqqq 话说这首曲子是新发现的QAQ(Xeuphoria的还是那么好听qwqqq 今天学了快读qvq 还有...dpwww P2015 二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉&#xf…

三十六亿的《哪吒》历时五年,如何用AI解决动画创作难题?

作者 | 神经小姐姐来源 | HyperAI超神经( ID: HyperAI )【导读】《哪吒之魔童降世》自 7 月 26 日上映以来,好评如潮,票房一路高歌猛进,目前已突破 36 亿。这款火爆的动画背后,是主创团队历时 5 年的细致打磨。而这漫长…

vb.net结构化异常处理和“邪用”

vb.net中的错误处理包括两种:非结构化异常处理技术和结构化异常处理。非结构化异常处理技术在vb 6.0中使用的比较普遍,即通过Err对象和ON Error、Go To、Resume等语句来实现。这种方式可以跟踪最近产生的异常和最近异常处理程序的位置。而结构化异常处理…

Ubuntu 14.04 64位机上不带CUDA支持的Caffe配置编译操作过程

Caffe是一个高效的深度学习框架。它既可以在CPU上执行也可以在GPU上执行。下面介绍在Ubuntu上不带CUDA的Caffe配置编译过程: 1. 安装BLAS:$ sudo apt-get install libatlas-base-dev 2. 安装依赖项:$ sudo apt-get install libprot…

NAT环境无法访问云端的深层次分析

这是一次我维护runningdoctor时候遇到的问题现象:1.用户无法打开web.runningdoctor.cn 2.监控状态无异常、无报警 3.tracert结果无异常、丢包率正常 4.用户无法访问的时候,我们能打开网站 5.多地代理访问网站,结果正常 6.有打开网站特别慢的时…

Magento(麦进斗)安装问题

安装到数据库那一步会跳出 lib\Zend\Db\Statement\Pdo.php on line 228 错误 解决方案: 在你的php模块里的php.ini文件添加(或者修改)max_execution_time1800 重启你的web服务器(apache,nginx),…

Linux Socket基础介绍

Linux Socket函数库是从Berkeley大学开发的BSD UNIX系统中移植过来的。BSD Socket接口是众多Unix系统中被广泛支持的TCP/IP通信接口,Linux下的Socket程序设计,除了微小的差别之外,也适用于大多数其它Unix系统。 Socket接口是TCP/IP网络的API…

免费公开课 | 基于定制数据流技术的AI计算加速

随着人工智能时代的来临,业内对于更高效率算力的需求也越来越紧迫,而传统的 CPU 计算能力弱,只适合软件编程,并不适合应用于人工神经网络算法的自主迭代运算。为了满足支撑深度学习的大规模并行计算的需求,人工智能芯片…

代替国足踢决赛?马宁当选卡日大战第四官员

卡塔尔杀进亚洲杯决赛。 图片来源:Osports全体育图片社 中新网1月30日电 日本与卡塔尔将会师本届亚洲杯的决赛。北京时间30日,亚足联官方已经公布了本次决赛的裁判组,中国裁判员马宁将担任第四官员。 来自乌兹别克斯坦的亚洲金哨伊尔马托夫将…

AI规模化落地,英特尔至强的七重助力

当今时代,各行各业与人工智能(AI)加速融合,通过智能化创新来寻求业务转型升级。与为数不多的顶级AI研发公司相比,大多数传统行业或企业有着更丰富的 AI 应用场景,推动着规模化的AI应用落地,其AI…

Linux进程编程基础介绍

Linux系统是一个多进程的系统,它的进程之间具有并行性、互不干扰等特点。也就是说,每个进程都是一个独立的运行单位,拥有各自的权利和责任。其中,各个进程都运行在独立的虚拟地址空间,因此,即使一个进程发生…

关于互联网技术基层绩效管理的一些思考

起因是一篇内部的文章,那记录也就留在内部吧,磨炼了的价值观在自己心里就好。 类似的还有 1. 罗振宇不发年终奖:https://xueqiu.com/7118120763/119669075 2. 有赞白鸦强行一波996:https://baijiahao.baidu.com/s?id1623959680…

波纹管 编织管

为什么80%的码农都做不了架构师?>>> 波纹管 编织管 http://wenku.baidu.com/view/4272a9feaef8941ea76e057e.html 转载于:https://my.oschina.net/tadcat/blog/151049

Git基础(常用命令)介绍

版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统. 关于版本控制分为三种:本地版本控制系统,如rcs;集中化的版本控制系统,如CVS、SVN;分布式版本控制系统,如Git。 Git基础要点 G…

MIT开发新加密货币,用户所需数据比比特币减少99%

MIT的研究人员开发了一种新的加密货币,大大减少了用户加入网络和验证交易所需的数据,与当今流行的加密货币相比,最高可达99%。这意味着网络更具扩展性。 像比特币之类流行的加密货币都是构建于区块链上的网络,而区块链是按照一系列…

深入了解AI加速芯片的定制数据流架构与编译器 | 公开课

随着人工智能时代的来临,业内对于更高效率算力的需求也越来越紧迫,而传统的 CPU 计算能力弱,只适合软件编程,并不适合应用于人工神经网络算法的自主迭代运算。为了满足支撑深度学习的大规模并行计算的需求,人工智能芯片…

《GPU高性能编程CUDA实战》中代码整理

CUDA架构专门为GPU计算设计了一种全新的模块,目的是减轻早期GPU计算中存在的一些限制,而正是这些限制使得之前的GPU在通用计算中没有得到广泛的应用。使用CUDA C来编写代码的前提条件包括:(1)、支持CUDA的图形处理器,即由NVIDIA推…

​50年来最具影响力的十大编程语言!

作者 | javinpaul译者 | 馨怡责编 | 屠敏出品 | CSDN(ID:CSDNnews)【导语】“适者生存”的自然法则在应用竞争激烈的编程语言界同样适用,而在数百种编程语言中,相对而言,哪些最具影响力?哪些才是…

【基础篇】DatePickerDialog日期控件的基本使用(一)

项目步骤&#xff1a; 1.首先在Main.xml布局文件中添加一个Button标签&#xff0c;用来点击显示日期控件&#xff0c;Main.xml内容如下&#xff1a; <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:tools"http://sch…

PoPo数据可视化第9期

PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域&#xff0c;发现可视化领域有意思的内容。不想错过可视化领域的精彩内容, 就快快关注吧 :)2018 in the Ito Design Lab&#xff08;视频内容请关注微信公众号浏览&#xff09;1900~2018年城市温度异常变化可视化Temperatur…