精华内容
下载资源
问答
  • 数据结构及其应用

    2016-04-24 15:41:10
    数据结构】: 啊哈,相信大家或多或少都接触了一些。线性数据结构lArrayList and LinkedList  非线性数据结构 HashSet and HashMap 今天提到这四个呢,并不是讲这几个怎么用,而是提出一个问题,为什么...

    【数据结构】:

    啊哈,相信大家或多或少都接触了一些。线性数据结构lArrayList  and  LinkedList

                                                                     非线性数据结构 HashSet  and  HashMap

    今天提到这四个呢,并不是讲这几个怎么用,而是提出一个问题,为什么那么多大型公司面试官这么喜欢问这四个,这么喜欢比较他们的区别呢,我在面试阿里的时候这个基本是每一面都要提到的,区别,区别,情景模拟怎么用,哪些数据结构用到?我们来慢慢引出?首先讲一下他们的特性,以及怎么用?

    ===================================================================================

    【ArrayList】:

        数组列表  线性数据结构,可以在任何位置对元素进行增删查改。

    但是:

    • ArrayList是非同步的。在多线程并发操作ArrayList场景下,需要我们写代码对ArrayList进行同步
    • ArrayList是利用数组实现的,本身可以看做是一个动态的数组,对元素增删都会引起数组内存分配空间动态发生变化,所以插入,删除会比较慢,但是检索速度快。

    【看一下方法】:

    boolean add(E e)

    将指定的元素添加到此列表的尾部。

    void add(int index, E element)

    将指定的元素插入此列表中的指定位置。

    boolean addAll(Collection<? extends E> c)

    按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。

    boolean addAll(int index, Collection<? extends E> c)

    从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。

    void clear()

    移除此列表中的所有元素。

    Object clone()

    返回此 ArrayList 实例的浅表副本。

    boolean contains(Object o)

    如果此列表中包含指定的元素,则返回 true。

    void ensureCapacity(int minCapacity)

    如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。

    E get(int index)

    返回此列表中指定位置上的元素。

    int indexOf(Object o)

    返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。

    boolean isEmpty()

    如果此列表中没有元素,则返回 true

    int lastIndexOf(Object o)

    返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。

    E remove(int index)

    移除此列表中指定位置上的元素。

    boolean remove(Object o)

    移除此列表中首次出现的指定元素(如果存在)。

    protected void removeRange(int fromIndex, int toIndex)

    移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。

    E set(int index, E element)

    用指定的元素替代此列表中指定位置上的元素。

    int size()

    返回此列表中的元素数。

    Object[] toArray()

    按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。

    <T> T[] toArray(T[] a)

    按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

    void trimToSize()

    将此 ArrayList 实例的容量调

     

    整为列表的当前大小。    

     

     

     

    ============================================================================

    【LinkedList】:

    同上

    注意:

    • 非同步,并发多线程需要自己写代码控制
    • 内部是链表实现,因此和ArrayList相比,增删很快,因为list不需要重新分配空间,但是检索速度慢
    • 实现了Queue接口,可做先进先出队列使用

     

     

     

     ===============================================================================

    【HashMap】

    数组

    数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难

    链表

    链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。

           哈希表

    那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。

     

     我们来看一组生动的图:

     可以看得出左边是数组,右边是链表的这种结合。

    hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。

    如果两个key通过hash%Entry[].length得到的index相同,会不会有覆盖的危险?

      这里HashMap里面用到链式数据结构的一个概念。上面我们提到过Entry类里面有一个next属性,作用是指向下一个Entry。打个比方, 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?HashMap会这样做:B.next = A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起。所以疑问不用担心。也就是说数组中存储的是最后插入的元素。到这里为止,HashMap的大致实现,我们应该已经清楚了。

    http://blog.csdn.net/vking_wang/article/details/14166593这个博客讲的更加清楚对Hashmap这个原理,能够看懂。

    ================================================================================

    【HashSet】:

    集合类型数据结构,实现了set的接口,满足数学定义,无序,不重复。

    • 非同步,多线程并发需要自己写代码
    • Hashset内部由HashMap实现,对元素增删查也有很高性能
    • 元素无序,对其遍历,不保证顺序都一致,也就是说每一次打印出来的元素位置都不一样
    • 没有重复元素,加入相同的对象到hashset里面,则最终hashset里面只有一个对象。

     

    展开全文
  • C语言中文网 Go语言二叉树数据结构应用 源码。一开始以为“btree”是golang的包呢。后来发现不是。又找以为是“https://github.com/google/btree.git”。发现还不是。这才想起来可能是自己写的包。绕了一圈子。 ...
  • 输入数据由2行组成,首先是一个正整数m(m),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n),求该多项式的前n项的和。 Output 对于每个测试实例n,要求输出多项式前n项的和。每个...
  • 七、图的应用7.1、两种常用的活动网络( Activity Network):① AOV网(Activity On Vertices)—用顶点表示活动的网络AOV网定义:若用有向图表示一个工程,在图中用顶点表示活动,用弧表示活动间的优先关系。...

    七、图的应用

    7.1、两种常用的活动网络( Activity  Network):

    ① AOV网(Activity  On Vertices)—用顶点表示活动的网络

    AOV网定义:若用有向图表示一个工程,在图中用顶点表示活动,用弧表示活动间的优先关系。Vi 必须先于活动Vj 进行。则这样的有向图叫做用顶点表示活动的网络,简称AOV。

    ② AOE网(Activity  On Edges)—用边表示活动的网络

    AOE网定义:如果在无环的带权有向图中,用有向边表示一个工程中的活动,用边上权值表示活动持续时间,用顶点表示事件,则这样的有向图叫做用边表示活动的网络,简称AOE。

    7.2、AOV网络的用途---拓扑排序

    我们经常用有向图来描述一个工程或系统的进行过程。一般来说,一个工程可以分为若干个子工程,只要完成了这些子工程,就可以导致整个工程的完成。

    AOV网络若用于教学计划的制定,可以解决:哪些课程是必须先修的,哪些课程是可以并行学习的。

    拓扑排序

    什么叫拓扑排序?

    按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。由此所得顶点的线性序列称之为拓扑有序序列

    如何进行拓扑排序?

    一、从有向图中选取一个没有前驱的顶点(即入度为零的顶点),并输出之;

    二、从有向图中删去此顶点以及所有以它为尾的弧(即弧头顶点的入度减1);

    重复上述两步,直到

    全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;

    或图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了。这时AOV网络中必定存在有向环。

    序号  1、2、3、4、5、6、7  前件的序号

    使用邻接矩阵实现拓扑排序:

    算法的执行步骤:

    1、找到全为零的第j 列,输出j

    2、将第j 行的全部元素置为零

    3、找到全为零的第k列,输出k

    4、将第k行的全部元素置为零   …………………

    反复执行3、4;直至所有元素输出完毕。

    使用邻接表实现拓扑排序:

    算法的执行步骤:

    1、用一个数组记录每个结点的入度。将入度为零的结点进栈。

    2、将栈中入度为零的结点V输出。

    3、根据邻接表找到结点V的所有的邻接结点,并将这些邻接结点的入度减一。如果某一结点的入度变为零,则进栈。

    4、反复执行 2、3;直至栈空为止。        …………………

    次序执行结束,如果输出结点数等于图的结点总数,则有向图无环,否则有向图有环。

    CountInDegree(G,indegree);  //对各顶点求入度

    InitStack(S);

    for ( i=0; i

    if(!indegree[i])  Push(S, i); //入度为零的顶点入栈

    count=0;           //对输出顶点计数

    while (!EmptyStack(S)) {

    Pop(S, v);  ++count;   printf(v);

    for (w=FirstAdj(v); w;  w=NextAdj(G,v,w)){

    --indegree(w);  // 弧头顶点的入度减一

    if (!indegree[w])  Push(S, w); //新产生的入度为零的顶点入栈

    }

    }

    if (count

    7.3AOE网络的用途:---确定关键路径

    常用于大型工程的计划管理。利用AOE网络可以解决以下两个问题:

    (1) 完成整个工程至少需要多少时间。(假设网络中没有环)?

    (2) 为缩短完成工程所需的时间, 应当加快哪些活动? 或者说,哪些活动是影响工程进度的关键?

    问题:假设以有向网表示一个施工流图,弧上的权值表示完成该项子工程所需时间。

    问:哪些子工程项是“关键工程”?

    即:哪些子工程项将影响整个工程的完成期限的。

    例设一个工程有11项活动,9个事件

    事件V1——表示整个工程开始

    事件V9——表示整个工程结束

    (1) 完成整项工程至少需要多少时间?

    (2) 哪些活动是影响工程进度的关键?

    关键路径

    在AOE网络中, 有些活动顺序进行,有些活动并行进行。

    从源点到各个顶点,以至从源点到汇点的有向路径可能不止一条。这些路径的长度也可能不同。完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,整个工程才算完成。

    完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和。这条路径长度最长的路径就叫做关键路径(Critical Path)。

    整个工程完成的时间为:从有向图的源点到汇点的最长路径。

    关键活动:该弧上的权值增加 将使有向图上的最长路径的长度增加。关键活动的最早开始时间 =关键活动的最迟开始时间

    构造关键路径的方法:要用到拓扑排序和逆拓扑排序

    事件发生时间的计算公式:

    ve(源点) = 0;              ve(k) = Max{ve(j) + dut()}

    vl(汇点) = ve(汇点);       vl(j) = Min{vl(k) – dut()}

    开始vl=18

    假设第i条弧为 ,  则 对第i项活动言

    “活动(弧)”的最早开始时间 ee(i):  ee(i) = ve(j);

    “活动(弧)”的最迟开始时间 el(i): el(i) =vl(k)–dut();

    算法描述

    •    输入顶点和弧信息,建立其邻接表

    •    计算每个顶点的入度

    •    对其进行拓扑排序

    排序过程中求顶点的Ve[i]

    将得到的拓扑序列进栈

    •    按逆拓扑序列求顶点的Vl[i]

    •    计算每条弧的e[i]和l[i],找出e[i]=l[i]的关键活动

    展开全文
  • 算法和数据结构的内容很多,就算是最基础的算法和数据结构,如果想完全熟悉到掌握应用,至少需要半年的时间。当然,每个人的基础不同,需要的时间具体也不一样。本文是我高强度学习四个月的积累,打算长期维护一年,...

    算法和数据结构的内容很多,就算是最基础的算法和数据结构,如果想完全熟悉到掌握应用,至少需要半年的时间。当然,每个人的基础不同,需要的时间具体也不一样。本文是我高强度学习四个月的积累,打算长期维护一年,喜欢的小伙伴可以收藏,共勉。

    前端到底怎么学数据结构和算法?

    数据结构和算法重要吗?我觉得 程序=数据结构+算法 至今都不过时。数据结构和算法这么多,我们没有必要全都学一遍。做一个全方面的了解,只需要把基础的算法和数据结构掌握,面对更难的数据结构和算法,也不至于手忙脚乱。因为算法和数据结构的内容实在太多了,我建议以下两点持续学习

    1. 适当刷leetcode题目,把题目当成是做数学题,把题目解答出来的兴趣是最大的驱动力。

    2. 善于分析业务需求,把学到的东西应用上去,学以致用真的很快乐。

    数据结构和算法到底什么关系?

    每个人的境界不同,理解也不一样。这里我的理解是, 数据结构就像造房子的材料,算法好比建筑师设计的图纸 。二者缺一不可,都是相辅相成的;材料脱离了设计稿,就是一堆废料。设计图纸没有材料的加持,就是一张废纸。如何评价房子优质?材料用得少,质量优质,就是一个好房子。这里的材料,其实就是指 空间复杂度 ;质量优质,很明显是指 时间复杂度 了 ps:底层码农搬砖,上层大佬设计。是不是极度的类似?

    数据结构的两个关系

    就像造房子,你不知道砖头是什么材质的,随便给你个豆腐你敢用吗?

    1. 存储结构(砖头什么材质)

    • 顺序存储,数组,区域连续存放的

    • 链式存储,链表,不一定是连续的,数据间首尾有前后关联关系

    • 索引存储,B+树,常用于数据库的索引,简单理解成一本书的索引目录即可

    • 散列存储,哈希表,顺序和逻辑上都不存在顺序关系,通过散列函数访问

    1. 逻辑结构(在设计稿上的具体实现)

    • 有线性规律的砖头,线性结构,常见的线性结构有:栈,队列,链表,数组。(首尾相接的)

    • 没有线性规律的砖头,非线性结构,常见的线性结构有:树,图。(非首尾相接的)

    时间复杂度大小关系

    必须记住的常用时间复杂度关系,数学基础达标的小伙伴记住并不难。

    • O(1) < O(log(n)) < O(n) < O(nlog(n)) < O(n^2) < O(2^n) < O(n!)

    数据结构

    数组

    1. 特点

    • 区域连续存放,可用地址寻址公式快速算出存放位置

    1. 优点

    • 所需能存很少,访问速度快 O(1)

    1. 缺点

    • 删除有可能会挪动整个数组,不稳定,较慢。O(n)

    • 会有内存大小的限制

    1. js下的数组

    • JSArray 是继承自 JSObject 的,所以在 JavaScript 中,数组可以是一个特殊的对象;

    • 内部是以 key-value 形式存储数据,所以 JavaScript 中的数组可以存放不同类型的值。

    • js的数据可以动态扩容,有两种方式存储,即快数组和慢数组。

    • 参考链接,瓶子君的V8数组分析 

      • https://github.com/sisterAn/JavaScript-Algorithms/issues/2

    链表

    1. 特点

    • 以单链表为例,多消耗一个next指针,指向下一个节点

    1. 优点

    • 不用区域连续,删除不需要挪动整个链表,删除快 O(1)

    1. 缺点

    • 占用的内存比数组大,访问慢,没有具体的寻址公式 O(n)

    1. 注意点

    • 重点掌握链表的基本操作,特别是反转链表

    • 反转链表一定要先抽象思考好整体,再写细节

    • 把链表抽象成节点,用脑子里想好的图来写代码

    //翻转 [a, b),不包括 bconst revese = (a, b) => {   let pre = null, cur = a, nex = a;   while(cur != b){     // 先保存好后面的,以免链表断了     nex = cur.next     // 开始反转,当前的指向前一个     cur.next = pre     // 继续翻转下一个,pre会变成新头     pre = cur     cur = nex   }   return pre}
    1. 常用的解题技巧, 快慢指针

    • 判断链表有没有环

    • 两个链表的第一个相交点

    1. 特点

    • 先进后出,非常重要

    1. 单调栈

    • 抽象成排队问题,非常适合求第一个大/小的问题

    • 单调递增,当前身高只能看到后面的高个子

    • 单调递减,当前身高只能看到后面的矮个子

    1. 经典题目

    • 找出第一个比左右两边都大的元素

    • 每日温度

    • 接雨水

    // 单调栈模板代码,以单调递减为例// 抽象成排队,找后面的第一个比自己高的let n = nums.lengthlet st = []let res = []// 倒着看可以避免不知道后面什么情况for(let i = n - 1; i < n; i--){  // 矮个子走开,我不需要你,当前是 nums[i]  // 只需要看到第一个比自己高的人  while(st.length && nums[i] >= st[st.length - 1]){    st.pop()  }  // 取第一个比自己高的,没有取-1  res.push(st.length ? st[st.length - 1] : -1)  // 进去排队  st.push(nums[i])}  //注意是从后往前遍历的喔return res.reverse()
    1. 解题技巧,加首尾哨兵

    队列

    1. 特点,先进先出;非常重要

    2. 队列,就类比成食堂排队打饭即可

    • 扩展的有双端队列,队头、队尾都可以进队出队

    1. 经典题目

    // 翻转字符串,let str = "the sky is blue" // -> "blue is sky the"

    散列表

    1. 散列表(哈希表/hash表)

    • 散列表其实也是日常生活中最常见的,就好比上课老师点的你学号。你的学号映射到你本人是谁。

    • 推荐阅读瓶子君的文章

    1. 散列函数

    • 给定一个关键字key,然后根据散列函数计算处理,得到关键字在散列表中的地址。这就是散列函数的作用

    • 得到关键字在散列表中的地址,就可以根据地址来索引得到值。

    1. 散列表和Object 对象的key-value键值对有什么区别呢?

    • 散列表在存储值的时候,也是用key-value键值对的形式存储值的。

    • 但是这两者有着本质的区别,不要搞混了,散列表是可以根据 拉链法,开地址法 这样手段来避免掉重复值问题,即不覆盖。

    • 具体的key-value键值对储存是会覆盖值的。初学者千万不要搞混了。

    • 散列表如果不考虑空间,是最好的数据结构,增删查改的性能都很好。

    1. 如何设计散列函数

    • 散列函数目的是计算关键字在散列表中的地址唯一。

    1. 冲突解决

    • 在散列里,冲突是不可避免的。那怎样解决冲突呢?

    • 开放地址法(也叫开放寻址法):实际上就是当需要存储值时,对Key哈希之后,发现这个地址已经有值了,这时该怎么办?不能放在这个地址,不然之前的映射会被覆盖。这时对计算出来的地址进行一个探测再哈希,比如往后移动一个地址,如果没人占用,就用这个地址。如果超过最大长度,则可以对总长度取余。这里移动的地址是产生冲突时的增列序量。

    • 链地址法:链地址法其实就是对Key通过哈希之后落在同一个地址上的值,做一个链表。

    • 再哈希法:在产生冲突之后,使用关键字的其他部分继续计算地址,如果还是有冲突,则继续使用其他部分再计算地址。这种方式的缺点是时间增加了。

    • 建立一个公共溢出区:这种方式是建立一个公共溢出区,当地址存在冲突时,把新的地址放在公共溢出区里。

    1. 散列表表示形式

    • 可以用个线性的数组存储链表,邻接链表

    1. 经典题目

    • 散列表应用的经典题目很多,这里就不列举了。

    • ES6 中的Map/Set这两个结构就是散列表储存的,用的是 邻接链表 。

    二叉树

    1. 特性

    • 最多仅有两个子节点

    1. 二叉树的扩展

    • 平衡二叉树:每个节点的左右子树的高度相差不能大于1,也叫平衡因子。了解四个旋转操作把树拉平

    • 满二叉树:非叶子节点都有左右子树,叶子节点从左往右占满,不留空白。

    • 完全二叉树:在满二叉树的基础上,叶子节点层右边可以空白,左边必须占满。

    • 二叉搜索树(BST):每个节点的值大于其任意左侧子节点的值,小于其任意右节点的值。平衡的二叉搜索树性能都是log n

    1. 四个遍历方式

    • 前序遍历

    • 中序遍历

    • 后续遍历

    • 层序遍历(BFS,后面图扩展)

    // 对于这三个遍历方式,递归实现很简单,这里用一种0/1标记法模拟栈,1表示访问过// 这套模板可以AC三道题目function Traversal(root){  let res = []  let stack = [[root, 0]]  while(stack.length){    let [node, color] = stack.pop()    if(node == null){      continue    }    // 没有访问过    if(!color){      // 因为用的是栈,先进后出      // stack.push([node, 1]),后序遍历      stack.push([node.right, 0])      // stack.push([node, 1]),中序遍历      stack.push([node.left, 0])      // stack.push([node, 1]),前序遍历    }else{      res.push(node.val)    }  }  return res}
    1. 二叉树特别适合递归算法,本质上,递归算法得状态树就是一个N叉树

    1. 特性

    • 就是一个完全二叉树,由于它的特性可以利用数组来存储

    • 完全二叉树的一些公式

    // 假设当前的节点树为 n,i为数组的下标// let parentNode = (i - 1) >> 1,>> 位运算不用向下取整// let leftNode = 2 * i + 1// let rightNode = 2 * i + 2// 构建堆,堆化,这里用一种比较简洁的heapify// heapify:把当前的节点当成一棵树,计算出左右子节点,如果根最大就是大根堆,如果根最小,就是小根堆const heapify = (n, i, arr) => {  // 递归出口  if(i >= n){    return  }  let max = i  let left = i * 2 + 1  let right = i * 2 + 2  //比较左子树  if(left < n && arr[left] > arr[max]){    max = left  }  // 比较右子树  if(right < n && arr[right] > arr[max]){    max = right  }  // 说明最大值不是自己  if(max != i){    swap(i, max, arr)    // 被调整过的子树需要继续调整    heapify(n, max, arr)  }}function swap(i, j, arr){    let temp = arr[i]    arr[i] = arr[j]    arr[j] = temp}// 这里扩展一下堆排序// 整体思路:先构建一个大根堆,然后把堆顶和最后一个元素交换,交换了的节点继续 heapify 操作调整即可const heapSort = (nums) => {  let n = nums.length  createMaxHeap(nums, n)  for(let i = n - 1; i >= 0; i--){    // 交换两个元素    swap(0, i, arr)    // 继续以交换了的做 heapify 调整为大顶堆    heapify(i, 0, nums)  }  return nums}function createMaxHeap(nums, n){  // 数组乱序的,我们就以第一个父节点,从下往上,从右往左做 heapify 即可  for(let i = (n - 1) >> 1; i >= 0; i--){    heapify(n, i, nums)  }}// 构建堆的过程是O(n),堆排序是n*log n

    跳表

    • 链表的访问太慢了,给链表加一层父级索引,每隔两个节点就用一个父级指针指向

    • 经典的时间换空间

    1. 两个表示方法

    • 二维矩阵(内存浪费较多,一般不用)

    • 邻接表

    var graph = {  "A": ['B', 'C'],  "B": ['A', 'C', 'D'],  "C": ['A', 'B', 'D', 'E'],  "D": ['B', 'C', 'E', 'F'],  "E": ['C', 'D'],  "F": ['D']}
    1. 图的两个遍历方式

    • BFS,一层层扫,核心:借助队列和哈希

    // 这里我们假设A点是起始点,用一个Set表示节点已经访问了function BFS(s = 'A') {  let graph = {  "A": ['B', 'C'],  "B": ['A', 'C', 'D'],  "C": ['A', 'B', 'D', 'E'],  "D": ['B', 'C', 'E', 'F'],  "E": ['C', 'D'],  "F": ['D']  }  let res = []  let queue = [s]  let hash = new Set(s) //用于存放已经被访问过的节点  while(queue.length){    let curNode = queue.shift()    let childList = graph[curNode]    for(let i = 0; i < childList.length; i++){      let child = childList[i]      if(!hash.has(child)){        hash.add(child)        queue.push(child)      }    }    res.push(curNode)  }  return res}
    • BFS能得到一颗层级树,这样就可以实现一个点到所有点的最短路径

    // 基于上面代码增加一个parent树即可function BFS(s = 'A') {  let graph = {  "A": ['B', 'C'],  "B": ['A', 'C', 'D'],  "C": ['A', 'B', 'D', 'E'],  "D": ['B', 'C', 'E', 'F'],  "E": ['C', 'D'],  "F": ['D']  }  let queue = [s]  let hash = new Set(s)  let parent = new Map([[s, null]])  while(queue.length){    let curNode = queue.shift()    let childList = graph[curNode]    for(let i = 0; i < childList.length; i++){      let child = childList[i]      if(!hash.has(child)){        hash.add(child)        queue.push(child)        parent.set(child, curNode)      }    }  }  return parent}
    • DFS,不到尽头不回头,核心:借助队列和哈希

    function DFS(s = 'A') {  let graph = {  "A": ['B', 'C'],  "B": ['A', 'C', 'D'],  "C": ['A', 'B', 'D', 'E'],  "D": ['B', 'C', 'E', 'F'],  "E": ['C', 'D'],  "F": ['D']  }  let res = []  let stack = [s]  //用于存放已经被访问过的节点  let hash = new Set(s)  while(stack.length){    let curNode = stack.pop()    let childList = graph[curNode]    for(let i = 0; i < childList.length; i++){      let child = childList[i]      if(!hash.has(child)){        hash.add(child)        stack.push(child)      }    }    res.push(curNode)  }  return res}
    1. DFS和BFS是最常用的搜索算法;

    • 这一部分推荐多刷点leetcode的题,这样才能巩固这两个算法。

    • 这两个算法非常的常用和实用


    往期精选

    Unity3D游戏开发中100+效果的实现和源码大全 - 收藏起来肯定用得着

    Shader学习应该如何切入?

    写出一手烂代码的19条准则


    声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。

    作者:切图小懵新

    来源:https://juejin.im/post/5ede18a8e51d4578455f3683


    More:【微信公众号】 u3dnotes


    f560c7b97c53796733128481aef8f30d.png

    展开全文
  • 数据结构与算法怎么学1....最常用,最基础的20个数据结构与算法,学习他们的“来历”,“特点”,“适合解决什么样的问题”和“实际的应用场景” 数据结构:数组,链表,栈,队列,散列表,二叉树...

    数据结构与算法怎么学

    1.是什么

    • 数据结构指的是“一组数据的存储结构”,算法是指“操作数据的一组方法”
    • 数据结构是为算法服务的,算法是作用在数据结构上的。

    2.学什么

    • 效率和资源消耗的度量衡—复杂度分析
    • 最常用,最基础的20个数据结构与算法,学习他们的“来历”,“特点”,“适合解决什么样的问题”和“实际的应用场景”
    • 数据结构:数组,链表,栈,队列,散列表,二叉树,堆,跳表,图,Tire数
    • 算法:递归,排序,二分查找,搜索,哈希算法贪心算法,分治算法,回溯算法,动态规划,字符串匹配算法

    3.怎么学

    多练,多思考,多写笔记

    展开全文
  • 一、什么是线性结构---应用广泛的数据结构线性结构是一种有序数据项的集合,其中每个数据项都有唯一的前驱和后继,除了第一个没有前驱,最后一个没有后继。新的数据项加入到数据集中时,只会加入到原有某个数据项...
  • 我自己认为,数据结构的学习分四层:第一层:简单理解功能,比如你知道栈是先进后出,队列是先进先出就行了,这个应该大部分人都能理解第二层:简单应用方法,比如你知道顺序表的实现由数组和链表的方式,他们各自的...
  • {"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行数据压测演练,...
  • prim算法示例演示-数据结构1 算法分析 问题提出 一个无环的有向图称作有向无环图,简称DAG图。 DAG图在工程计划和管理方面应用广泛。几乎所有的工程(project)都可分为若干个称作“活动”的子工程, 并且这些子工程...
  • 1.先叨叨几句 ...也趁着这段时间好好的了解了数据结构这一块,有了深入的了解后,感觉还确实不一样,因为只有了解后,才知道到每种数据结构特点及应用场景,甚至针对特殊场景进行结构优化,当然,一般...
  • 数据结构:栈的应用

    2019-07-19 13:59:44
    那么在括号的匹配中是怎么应用栈的呢? 我们可以很快的想象到,在我们手写括号的时候,我们是否是写了一个括号就赶紧把它闭起来,也就是说,{(这样两个括号,里面的小括号是不是肯行要先闭合起来,然后再闭合外面的...
  • 因为数据结构的书上很多都是伪代码,所以在这里共享下自己摸索出来的怎么数据结构的完整简单编程,给自学者参考,参考。 头插法的简单应用: ///////////////////////定义一个节点类型//////////////////////// ...
  • 这个代码是老师给的,但是里面那个字符数组我不是很懂,请问这个的主函数怎么写?![图片](https://img-ask.csdn.net/upload/201711/13/1510556037_612219.jpg)
  • Problem Description A letter tree is given on this page (HDOJ 4601). Another letter tree of N nodes is now given, where each node is assigned to a lowercase letter. When making a tour from a node ...
  • 在《JAVA数据结构及算法--Stack分析》这篇文章中分析了源码Stack是怎么实现的,接下来要分析怎么自己去实现栈,栈有那些应用。本章内容主要参考于《Java数据结构和算法第二版》这本书。 1、通过基本数据类型long...
  • 很好的一本书,可以教会你一些用数据结构算法怎么编写号的程序
  • GPS北斗双模技术应用开发研究—数据结构扩展 还是从gps.h头文件入手,首先 GpsSvStatus结构体需要改造,GpsSvStatus当时设计的时候是考虑存储gps卫星信息的,但是我们现在是要存储双模的数据,因此我们需要扩展这...
  • 我是一个计算机专业的本科生,现在我们刚刚学完了数据结构。据说数据结构对于我们编程很重要,可是我现在不知怎么数据结构和C语言结合起来,以便更好的进行c语言编程。有哪位高手指点一二,在下感激不尽!
  • 理解数据结构

    2021-01-01 02:33:54
    记得在开始学习编程的时候,对数据结构没什么概念,感觉编程就是那么回事,不用数据结构也能编出一大堆程序,然而我只能说那都是些小孩子过家家玩的小程序而已,程序中几乎没有用到多少数据,无论你怎么存储,程序...
  • 本文学习关于树和森林的存储结构相关的知识,如常用的表示方法,树与二叉树怎么转换?森林与二叉树又怎么转换?树的遍历与二叉树的遍历有何区别?详细请见文。
  • 集合是python的数据结构的一种,也是我们比较常见的数据结构,从小学就应该接触过集合,集合是无序的,他没有排列顺序,同时也不会存在相同的数字,就像下面的代码 x = set('123132313') print(x) {'3', '1', '2'} ...
  • 注意不是简单的把算是列出运算,因为我们看这个算式722-5,但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。–>栈 栈的介绍 栈的英文为(stack) 栈是一个先入后出...
  • matlab数据结构

    2013-08-18 22:36:49
    本文档是介绍MATLAB里的数据结构特点及应用。注意不是说MATLAB怎么数据结构,而是讲矩阵,元胞,数组等应用
  • 很多人比较疑惑,学数据结构有什么用,其实这个问题比较难回答,不是因为不知道怎么说,而是往深了说铺垫太长,往浅了说,又会词不达意,因此,我想等最后再说这个问题,那么首先还是可以讨论讨论学习数据结构我们...
  • 突然,发现自己对算法已经很生疏了,象最短路径,邻接矩阵等名词似乎很熟,但细想一下,该怎么实现呢?才发现,自己已经忘掉了他们.于是,想闲来温习一下,最后选了这本书,很不错,还可以温习一下...数据结构算法与应用(C++语...
  • 数据结构与算法--图的应用之最短路径前言1. Dijkstra 算法2. 佛洛依德(Floyd)算法 前言   上一篇简单的介绍了图的应用之最小生成树的两种求解方法,本篇来了解一下关于 图的最短路径 的两种求解方法 首先看下面...
  • 关键字数据结构介绍,算法推导大O阶的方法,线性表结构的介 绍,顺序结构与链式结构差异,栈与队列的应用,串的朴素模式匹配、 KMP模式匹配算法,树结构的介绍,二叉树前中后序遍历,线索二叉 树,赫夫曼树及应用,...
  • 比如说我想在传输一个G的文件时,数据就已经是struct msghdr结构了,我想问一下,这1G的数据怎么样转化成struct msghdr结构的!!再次谢谢您的时间!buff, size_t, len,unsigned, flags, struct sockaddr __user *...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,084
精华内容 833
关键字:

数据结构怎么应用

数据结构 订阅