首页 > 编程语言 >历时三年,写的一本数据结构与算法pdf,开源了!

历时三年,写的一本数据结构与算法pdf,开源了!

时间:2023-11-12 14:33:20浏览次数:33  
标签:数据结构 算法 链表 开源 理解 pdf 排序

前言

大家好,我是bigsai,很早就在写博客,将文章整理成了一个pdf,并且开源到github上!

自己写东西断断续续也不少时间了,也写了不少东西(虽然是偏向小白),这个其实花费的时间还是比较多的,这次的话主要将数据结构与算法中一些文章整理出来,初步整理成一版pdf,先分享给大家。

因为在整理pdf方面没啥经验,目前还是md直接导出的pdf的,看了下有些部分代码太长太占页面,有些部分图片太长也很占地方,有部分文章还尝试不同风格显得不那么条理,有些地方页面突然分割也很影响视觉体验……

虽然有很多缺点和问题,这些地方后面也在想办法考虑一点点优化,也欢迎大伙提出宝贵的意见!当然这个仓库也是开源的,有兴趣一起维护的可以维护。

更新会同步到Github仓库中,也会告知大家。近期会将以前写的其他数据结构算法部分(未优化)优化更新上去。

github地址https://github.com/javasmall/bigsai-algorithm

主要内容

  1. 理论基础搭建

    • 绪论基础知识:理解数据结构的相关概念,熟悉时间复杂度和空间复杂度。
    • 写给小白硬核递归:通过解决经典问题,深入理解递归,掌握记忆化递归的妙用。
  2. 线性结构的掌握

    • 图解线性表:手写顺序表和链表,理解带头结点和不带头结点链表的实现区别。
    • 图解双链表:手写双链表,考虑好节点直接联系,特别是考研重点。
  3. 栈与队列的熟练使用

    • :掌握后进先出规则,实现上用顺序表和链表考虑区别。
    • 队列:理解先进先出规则,实现上使用循环数组和链表分别实现。
  4. 更高级的线性结构

    • 跳表:了解跳表的增删改查原理和流程,拓宽对链表的认识。

      image-20231112122201531

    • 约瑟夫环问题:通过链表法、List模拟、公式法逐步深入这个问题。

  5. 树的深入学习

    • 二叉树层序遍历:学会使用队列进行层序遍历,解决二叉树之字形遍历。
    • 二叉树前中后遍历:熟练掌握非递归方式遍历,建立对树结构的全面理解。
    • 二叉搜索(查找)树:学会查找方式和删除节点逻辑。
    • 二叉平衡(AVL)树:了解平衡二叉树的旋转方式,以及不同平衡方式的应用。
  6. 其他重要数据结构

    • 哈夫曼树:理解哈夫曼树的weight计算方式和哈夫曼编码。
    • 字典(Trie)树:手写字典树,熟悉其应用场景和优势。
    • 优先队列:了解借助堆的运行原理。
    • 并查集(不相交集合):手写并查集,理解路径压缩的优势。
  7. 问题解决方法的学习

    • 回溯算法:通过解经典问题如八皇后问题,深刻理解回溯思想。
    • 分治算法:学会先分后合并,解决经典问题如二分搜索、快排、归并排序、最近点对等。
    • 搜索算法:深度优先搜索、广度优先搜索,解决问题如蓝桥杯,提高解决实际问题的能力。
    • 拓扑排序:理解图论算法,得到一个前后的顺序序列。
    • Dijkstra算法:了解图论单源最短路径,队列+贪心实现。
    • Floyd算法:了解图论多源最短路径,代码简短但需要深刻理解。
    • 最小生成树算法:Prim和Kruskal,了解不同贪心策略的应用。
  8. 位运算与数论算法

    • 位运算:介绍几种位运算,解决大部分经典位运算问题。
    • 求素数:掌握素数筛和欧拉筛的应用。
    • 快速幂:数论算法,掌握非递归、递归写法,了解矩阵快速幂。
  9. 大数运算

    • 大数加减乘除:手写大数运算,了解大数除法的思想。

      image-20231112121702785

  10. 十大排序算法

    • 冒泡排序、快速排序:了解交换类排序的原理和应用。
    • 插入排序、希尔排序:理解插入类排序的方法和优势。
    • 归并排序:学会归并类排序的实现。
    • 简单选择排序、堆排序:掌握选择类排序的原理。
    • 桶排序、计数排序、基数排序:了解桶类排序的应用场景和实现。
    • 双轴快排:优化快排的方法,深入理解排序算法的差异。

推荐资料

  1. 书籍
    • 《算法导论》:经典之作,系统全面地介绍了算法和数据结构。
    • 《数据结构与算法分析》:作者Mark Allen Weiss,深入浅出地讲解数据结构与算法。
    • 《剑指Offer》:针对面试算法题的详尽解析,适合入门和面试准备。
  2. 在线教程
    • LeetCode:刷题神器

github地址https://github.com/javasmall/bigsai-algorithm

持续更新中,欢迎star支持 !

标签:数据结构,算法,链表,开源,理解,pdf,排序
From: https://www.cnblogs.com/bigsai/p/17827160.html

相关文章

  • 开源多模态模型—MiniGPT-5,多模态生成的突破
    在人工智能领域,多模态生成已成为科技巨头争相突破的前沿。而MiniGPT-5模型,由加州大学圣克鲁斯分校研发,提出了全新的“GenerativeVokens”概念,创新性地构建了文本与图像特征空间的桥梁,推动了普通训练数据的有效对齐,同时生成高质量的文本和图像。MiniGPT-5的核心技术:GenerativeVoke......
  • meson 开源构建工具试用
    meson是基于python开发的构建系统,对于构建利用了Ninja,以下是一个简单的试用安装我使用mac系统直接通过brew安装的brewinstallmesonninja简单项目项目结构├──add.c├──add.h├──main.c└──meson.buildma......
  • 数据结构之树(树转化为二叉树也叫二叉化)
    说明对于将一般树结构转化为二叉树,使用的方法称为“Child-Sibling”(Leftmost-child-next-right-sibling)法则。步骤1.将节点的所有兄弟节点,用横线连接起来2.删掉所有与子节点间的链接,只保留与最左子节点的链接3.顺时针旋转45度 二叉树转化为多叉树与树转化为二叉树......
  • 数据结构之树(线索树)
    线索二叉树二叉树有些节点没有左子树或没有右子树或左右子树都没有,那么就会存在空链接的情况,为了充分利用空链接,让其指向树的其他节点,这些指向其他节点的链接就是线索,这棵树也变成了线索二叉树。二叉树变成线索二叉树的步骤1.二叉树先根据中序遍历的方式,进行排序(这样节点就直......
  • Redission实现公平锁为什么要使用ZSet数据结构?
    Redission实现公平锁为什么要使用ZSet数据结构?使用ZSet结构有什么好处?看lua代码好像也并没有使用到ZSet的二分查找这种优势,在Redisson中实现公平锁时使用ZSet(有序集合)数据结构有以下几个好处:具有排序功能:ZSet是有序的数据结构,其中的每个元素都有一个分数(score)与之相关联。这使得R......
  • vue2.0,把vform666、workFlow开源组件集成到vue-admin-template框架上心得体会
    以上三个都是vue2版本的开源项目,有的已经有vue3版本了,我把他们集成到一起,是出于练习的目的,也是消磨时间。vue-admin-template是一个很基础简洁的后台管理系统框架;vform666是可以用作表单低代码开发的组件项目;workFlow是模仿钉钉的工作流的组件项目,这三个项目在gitee上都能搜索到,......
  • 开源大语言模型Llama 2
    Llama2Github开源地址我们正在释放大型语言模型的潜力。我们最新版本的Llama现在可供个人、创作者、研究人员和各种规模的企业使用,以便他们可以负责任地进行实验、创新和扩展他们的想法。此发布包括预训练和微调的Llama语言模型的模型权重和起始代码,参数范围从7B到70B......
  • JavaSEday05 泛型,数据结构,List,Set集合
    javSEday05泛型,数据结构,List,Set今日目标泛型使用数据结构ListSet1泛型1.1泛型的介绍泛型是一种类型参数,专门用来保存类型用的最早接触泛型是在ArrayList,这个E就是所谓的泛型了。使用ArrayList时,只要给E指定某一个类型,里面所有用到泛型的地方都会被......
  • JavaSE day05【泛型,数据结构,List接口,Set接口】测评题
    选择题题目1(单选):查看下列代码,选出正确的传参()publicclassTest2{publicstaticvoidmain(String[]args){ArrayList<Integer>list1=newArrayList<Integer>();ArrayList<Number>list2=newArrayList<Number>();Arr......
  • 一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)
    请问以下JS代码的执行结果是什么?functioncontrol(x){if(x==3)thrownewError("break");}functionfoo(x=6){return{next:()=>{control(x);return{done:!x,value:x&&x--};}}}letx=newObject;x[Symbol.......