点击上方“AI有道”,选择“置顶”公众号

重磅干货,第一时间送达

数据结构和算法是程序员的内功心法和基本功。无论是人工智能还是其它计算机科学领域,掌握扎实的数据结构和算法知识,往往会助力不少!今天给大家推荐一份不错的数据结构与算法资源。特点是:全代码实现!

这份资源的作者王争老师是前 Google 工程师,5 万+人跟着学的《数据结构和算法之美》专栏作者。他总结了程序员必备的 50 个数据结构与算法,以及相应的代码实现。开源地址为:

https://github.com/wangzheng0822/algo

我们来看一下这必备的 50 个数据结构与算法究竟包含了哪些内容。

数组 

  • 问题:实现一个支持动态扩容的数组

  • 问题:实现一个大小固定的有序数组,支持动态增删改操作

  • 问题:实现两个有序数组合并为一个有序数组

链表

  • 问题:实现单链表、循环链表、双向链表,支持增删操作

  • 问题:实现单链表反转

  • 问题:实现两个有序的链表合并为一个有序链表

  • 问题:实现求链表的中间结点

栈 

  • 问题:用数组实现一个顺序栈

  • 问题:用链表实现一个链式栈

  • 问题:编程模拟实现一个浏览器的前进、后退功能

队列 

  • 问题:用数组实现一个顺序队列

  • 问题:用链表实现一个链式队列

  • 问题:实现一个循环队列

递归 

  • 问题:编程实现斐波那契数列求值f(n)=f(n-1)+f(n-2)

  • 问题:编程实现求阶乘n!

  • 问题:编程实现一组数据集合的全排列

排序 

  • 问题:实现归并排序、快速排序、插入排序、冒泡排序、选择排序

  • 问题:编程实现O(n)时间复杂度内找到一组数据的第K大元素

二分查找 

  • 问题:实现一个有序数组的二分查找算法

  • 问题:实现模糊二分查找算法(比如大于等于给定值的第一个元素)

散列表 

  • 问题:实现一个基于链表法解决冲突问题的散列表

  • 问题:实现一个LRU缓存淘汰算法

字符串 

  • 问题:实现一个字符集,只包含a~z这26个英文字母的Trie树

  • 问题:实现朴素的字符串匹配算法

二叉树 

  • 问题:实现一个二叉查找树,并且支持插入、删除、查找操作

  • 问题:实现查找二叉查找树中某个节点的后继、前驱节点

  • 问题:实现二叉树前、中、后序以及按层遍历

堆 

  • 问题:实现一个小顶堆、大顶堆、优先级队列

  • 问题:实现堆排序

  • 问题:利用优先级队列合并K个有序数组

  • 问题:求一组动态数据集合的最大Top K

图 

  • 问题:实现有向图、无向图、有权图、无权图的邻接矩阵和邻接表表示方法

  • 问题:实现图的深度优先搜索、广度优先搜索

  • 问题:实现Dijkstra算法、A*算法

  • 问题:实现拓扑排序的Kahn算法、DFS算法

回溯 

  • 问题:利用回溯算法求解八皇后问题

  • 问题:利用回溯算法求解0-1背包问题

分治 

  • 问题:利用分治算法求一组数据的逆序对个数

动态规划 

  • 问题:0-1背包问题

  • 问题:最小路径和

  • 问题:编程实现莱文斯坦最短编辑距离

  • 问题:编程实现查找两个字符串的最长公共子序列

  • 问题:编程实现一个数据序列的最长递增子序列

以上所有的数据结构与算法都配备相应的程序代码。一大特点是代码配备多种编程语言,例如 Python、C、Java、Go、Scala 等。

举例来说,关于常见的排序算法,例如冒泡排序、插入排序、选择排序,作者给出了相应的 Python 代码实现:

"""Bubble sort, insertion sort and selection sort冒泡排序、插入排序、选择排序Author: Wenru
"""from typing import List# 冒泡排序
def bubble_sort(a: List[int]):length = len(a)if length <= 1:returnfor i in range(length):made_swap = Falsefor j in range(length - i - 1):if a[j] > a[j + 1]:a[j], a[j + 1] = a[j + 1], a[j]made_swap = Trueif not made_swap:break# 插入排序
def insertion_sort(a: List[int]):length = len(a)if length <= 1:returnfor i in range(1, length):value = a[i]j = i - 1while j >= 0 and a[j] > value:a[j + 1] = a[j]j -= 1a[j + 1] = value# 选择排序
def selection_sort(a: List[int]):length = len(a)if length <= 1:returnfor i in range(length):min_index = imin_val = a[i]for j in range(i, length):if a[j] < min_val:min_val = a[j]min_index = ja[i], a[min_index] = a[min_index], a[i]def test_bubble_sort():test_array = [1, 1, 1, 1]bubble_sort(test_array)assert test_array == [1, 1, 1, 1]test_array = [4, 1, 2, 3]bubble_sort(test_array)assert test_array == [1, 2, 3, 4]test_array = [4, 3, 2, 1]bubble_sort(test_array)assert test_array == [1, 2, 3, 4]def test_insertion_sort():test_array = [1, 1, 1, 1]insertion_sort(test_array)assert test_array == [1, 1, 1, 1]test_array = [4, 1, 2, 3]insertion_sort(test_array)assert test_array == [1, 2, 3, 4]test_array = [4, 3, 2, 1]insertion_sort(test_array)assert test_array == [1, 2, 3, 4]def test_selection_sort():test_array = [1, 1, 1, 1]selection_sort(test_array)assert test_array == [1, 1, 1, 1]test_array = [4, 1, 2, 3]selection_sort(test_array)assert test_array == [1, 2, 3, 4]test_array = [4, 3, 2, 1]selection_sort(test_array)assert test_array == [1, 2, 3, 4]if __name__ == "__main__":array = [5, 6, -1, 4, 2, 8, 10, 7, 6]bubble_sort(array)print(array)array = [5, 6, -1, 4, 2, 8, 10, 7, 6]insertion_sort(array)print(array)array = [5, 6, -1, 4, 2, 8, 10, 7, 6]selection_sort(array)print(array)

当然,还有其它编程语言的代码实现,这里就不一一列举了!

目前,这份资源已经在 GitHub 上收获了 6000 星了。是一份不错的数据结构与算法参考代码。值得一看。最后再附上地址:

https://github.com/wangzheng0822/algo


推荐阅读

(点击标题可跳转阅读)

完备的 AI 学习路线,最详细的资源整理!

干货 | 公众号历史文章精选

我的深度学习入门路线

我的机器学习入门路线图

觉得这篇文章有帮助?请转发给更多人

关注 AI有道 加星标,获取最新 AI 干货

最新 AI 干货,我在看❤️

数据结构与算法必备的 50 个代码实现相关推荐

  1. 数据结构与算法精选面试50题(附答案)

    1.数组编码面试问题 数组是最基本的数据结构,它将元素存储在一个连续的内存位置.这也是面试官们热衷的话题之一,在任何一次编程面试中,你都会听到很多关于数组的问题,比如将数组中元素位置颠倒,对数组进行排 ...

  2. 数据结构与算法——二叉排序树详解以及代码实现

    二叉排序树介绍 我们知道二叉树,每个结点最多有2棵子树,被称为左子树 和 右子树. 二叉排序树,显然也是一颗二叉树,它有更突出的特性在数据域上呈现排序的特性. 在二叉排序树中,每个树的左子树的数据域均 ...

  3. char栈java,Java数据结构与算法-栈和队列(示例代码)

    (摘录加总结)------ 栈和队列不属于基础的数据结构,它们都属于线性表. 一.栈 对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构.按照"先进后出&qu ...

  4. 数据结构与算法 - 稀疏数组(理解+代码实现案例)

    举例 稀疏数组第一行是原数据几行几列和几个有效数据的个数 下面的行是各个有效数组的行列与具体值 稀疏数组实现 代码实现 package DataStructures.sparsearray;/*** ...

  5. Python数据结构与算法基础|第三期:代码实现——顺序存储队列与链式存储队列

    由于队列的动态由队头指针与队尾指针共同反映,所以我们在实现先入后出的同时还要实现队头元素与队尾元素的访问.对于普通的队列,我们使用列表实现其顺序存储,使用其它方法实现其链式存储. 顺序存储 由于我们使 ...

  6. Python数据结构与算法基础|第二期:代码实现——栈的顺序存储与链式存储

    顺序存储的栈 由于Python内置的列表是顺序存储的,所以我们直接使用列表作为顺序存储的栈的底层.具体代码如下: class Stack(object):'实现顺序栈.'def __init__(se ...

  7. 数据结构与算法——图解平衡二叉树及代码实现

    平衡二叉树介绍 平衡二叉树,是一种二叉排序树,其中每一个节点的左子树和右子树的高度差最多等于1.由3位科学家共同发明,用他们首字母命名 又被称为AVL树.从平衡二叉树的名称,你也可以体会到它是一种高度 ...

  8. 我接触过的前端数据结构与算法

    前言 史上可能最长的了,适合收藏慢慢看. 正文从这开始- 1. 递归 递归就是自己调自己,递归在前端里面算是一种比较常用的算法.假设现在有一堆数据要处理,要实现上一次请求完成了,才能去调下一个请求.一 ...

  9. 循环首次适应算法_数据结构与算法之2——排序问题

    排序真的是数据结构与算法中的重中之重啊,无论是对编程能力的提升,以后工作后的应用,或者是应对面试的时候都是经常需要用到的.基本的几个经典排序一定要做到滚瓜烂熟,能够做到给你一个具体的排序算法题,一定能 ...

最新文章

  1. 零基础入门学习Python(26)-文件1
  2. python opencv创建图像_使用Python中OpenCV库创建一幅图片的RGB通道图片
  3. 移动社交如何玩?网易云信携手崽崽和Uki打造更多新场景!
  4. 响应式设计的真正挑战:RSS
  5. Matlab形态学图像处理:二值图像分割 标记连通区域和重心位置 删除连通区域
  6. qq农场 html5,腾讯客服-QQ农场/牧场-QQ农场打不开该怎么解决?
  7. java常见经典知识点汇总
  8. SAS︱数据索引、数据集常用操作(set、where、merge、append)
  9. linux dstat工具
  10. 网络驱动器映射成功但无法更新文件_FTP映射网络驱动器-ExpanDrive for mac
  11. 2015年Java组B组
  12. android markdown编辑器,安卓版好用的Markdown编辑器
  13. Windows下TexLive2015 TeXstudio 和SumatraPDF安装配置
  14. 知网不能下载PDF?CAJ格式太鸡肋?
  15. 高频电子线路复习笔记(2)——高频电路基础
  16. 路由器和交换机哪个更好?路由器交换机怎么连接?
  17. Vitis指南 | Xilinx Vitis 系列(一)
  18. 程序读取斗罗大陆热点词汇热度
  19. 浙江大学《概率论与数理统计》
  20. (41.1)【JWT-KID漏洞】KID之目录遍历、命令注入、SQL注入

热门文章

  1. 响应式编程RxJava (一)
  2. Selenium_用selenium webdriver实现selenium RC中的类似的方法
  3. java内存对象模型
  4. iOS Assigning to 'idXXXDelegate' from incompatible type 'BViewController *__strong'
  5. jquery实现表格的多行删除
  6. Golang之理解错误输出
  7. sql server中对xml进行操作
  8. java程序运存扩容
  9. 一次面试引发的思考(中小型网站优化思考)
  10. iOS学习 plist读取和写入文件