• 五岳寻仙
    2019-01-07
    课后思考题,自己能想到的。

    1.获取通过某条路的时间:通过某条路的时间与①路长度②路况(是否平坦等)③拥堵情况④红绿灯个数等因素相关。获取这些因素后就可以建立一个回归模型(比如线性回归)来估算时间。其中①②④因素比较固定,容易获得。③是动态的,但也可以通过a.与交通部门合作获得路段拥堵情况;b.联合其他导航软件获得在该路段的在线人数;c.通过现在时间段正好在次路段的其他用户的真实情况等方式估算。

    2.混合公交、地铁和步行时:地铁时刻表是固定的,容易估算。公交虽然没那么准时,大致时间是可以估计的,步行时间受路拥堵状况小,基本与道路长度成正比,也容易估算。总之,感觉公交、地铁、步行,时间估算会比开车更容易,也更准确些。
    展开
     4
     53
  • 徐凯
    2019-01-07
    @五岳寻仙的答案太棒了 👏 我感觉每条道路应该还有限速,这个因素也要考察。
    
     16
  • Liam
    2019-01-08
    有2个疑问:

    1 Dijkstra就是贪心算法吧?
    2 它的解可能不是最优解

    作者回复: Dijkstra实际上可以看做动态规划:)

     2
     8
  • 李东勇
    2019-01-13
    有兴趣的可以看下LeetCode 上这道题: https://leetcode.com/problems/network-delay-time/
    用到的就是Dijkstra 算法
    
     7
  • 林大涛
    2019-02-13
    用小顶堆,就是为了确保每个阶段,堆顶的节点都是目前阶段的最短路径的节点。
    
     6
  • xuery
    2019-03-22
    构建优先队列的update函数时,时间复杂度应该是O(n),因为小顶堆查找的时间复杂度是O(n),虽然查找之后向上堆化的时间复杂度时O(logn)
    
     4
  • yongxiang
    2019-01-12
    王老师,我输入代码运行后,实际出队列的顺序跟图中的不一样,实际(15,0)出队列 在(13,3)出队列前面。我看了代码,应该是修改(25,1)为 (13,3)的时候,小顶堆不会自动更新顺序。需要对22行进行如下修改,更新已经在队列中,又改了dist的Vertex的优先级:
                       if (inQueue[nextVertex.id] == false){
                            queue.add(nextVertex);
                            inQueue[nextVertex.id] = true;
                        }
                        else { // 更新已经在队列中,又改了dist的Vertex的优先级
                            queue.remove(nextVertex);
                            queue.add(nextVertex);
                        }
    展开

    作者回复: 嗯嗯 我更新下代码

    
     4
  • Shaohong
    2020-01-14
    geeksforgeeks上面对Dijkstra算法介绍很好懂。https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7
    根据这个算法,老师没有必要用inqueue数组。可以一开始就把所有Vertex都加入到PriorityQueue中,之后就只做取顶操作和更新操作。
    
     2
  • Monday
    2019-08-30
    Dijkstra算法的最后到例子-那张图,各个节点的(0,无), (10,0)等等代表什么意思
     1
     2
  • mαnajay
    2019-05-18
    最开始以为是贪心算法, 再看了一遍,才发现优先级队列的作用(拥有类似回溯的功能),按照已添加队列中最短距离进行小顶堆, 每次 poll 的过程中,都有可能将之前已经计算过的顶点再拿出来, 遍历邻接表,重复到目的顶点
    
     2
  • 許敲敲
    2019-01-07
    类似的python代码也会更新嘛,还不熟悉java的
    
     2
  • 张智凯
    2020-01-03
    感觉这个算法最不容易让人理解的地方就是优先级队列里的某个顶点B pop出去以后,会不会以后会有某个还没有入队列的节点C 使经过节点C到B到源点的距离更近,实际这是不会的,因为优先级队列每次都是pop出当前离源点距离最近的点,假如节点C经过B使B到源点的距离更近,那么C点在优先级队列一定会比B先pop出去,然后更新B到源点的距离,想明白这一点,这个算法就很好理解了。
    
     1
  • 张智凯
    2020-01-02
    第十三天:
    地图软件是如何计算出最短路径的
    我们把每个岔路口看作一个顶点,岔路口与岔路口之间的路看作一条边,路的长度就是边的权重。如果路是单行道,我们就在两个顶点之间画一条有向边;如果路是双行道,我们就在两个顶点之间画两条方向不同的边,这样就构成了一幅有向有权图。这个问题就转化为求一个有向有权图中,两个顶点最短路径的问题。
    上述问题可以使用dijkstra算法
    原理:将每个顶点到起始顶点的距离初始为无穷,然后从起始点开始,将其加入一个优先级队列中,从优先级队列中取出到源点距离最小的顶点,然后比较其周围顶点离源点的距离是否大于其到源点的距离+其到周围顶点的距离,如果大于的话,更新周围顶点到源点的距离为较小的值以及其前序节点,并将其加入优先级队列中(如果已经加入过,就不需加入了),再取出优先级队列中的距离最小值,循环往复,直到取出终止顶点t,或者优先级队列为空。此时倒序输出终止顶点t的前序节点,前序节点的前序节点。。。,直到前序节点的前序节点为s,此时路径即为最短路径。
    计算最少红绿灯依然可以采用上述的思路,构造一个有向无权图。
    对于地点跨度范围比较大,可以分阶段来计算,找出哪些点是必经的点,然后拆分阶段。具体到每个区域,可以找个合适的区域将源点与中点覆盖进去,来减少顶点的数量。
    展开
    
     1
  • mrlay
    2019-07-20
    这是一个动态规划的问题,我最开始也以为是个贪心算法,会有这样的想法是每次都会去选择dist最小的那个顶点,殊不知这个顶点是在算完每个邻接顶点后(有可能是间接相邻的)选择最小的那个。
    vertex 临时数组的作用就是为了临时记录从起点到该顶点dist, 用来更新最小优先队列。
    
     1
  • 小刚z
    2019-05-21
    a0b0c0扩展后可以得到之后会得到三个组合,a1b0c0,a0b1c0,a0,b0,c1,请问一下这三个组合是怎么推导出来的

    作者回复: a0b0c0 -》 a1b0c0: a0->a1 其他的不变;
    a0b0c0 -》 a0b1c0: b0->b1 其他的不变;
    a0b0c0 -》 a0b0c1: c0->c1 其他的不变.

    比a0b0c0第二小的数据肯定出现在这三个候选中。

    
     1
  • Geek_dddebb
    2019-01-07
    亲测更新vertex后对象在队列中的位置不变

    作者回复: 代码已经改正,你再看下?;)

    
     1
  • 魏全运
    2019-01-07
    vertex compareTo有问题吧,怎么没有相等的分支呀?

    作者回复: 有也可以 没有也可以的

    
     1
  • hughieyu
    2019-01-07
    更新vertex后是否要更新一下对象在优先级队列中的位置,否则会预期更晚弹出优先级队列,会影响查找的速度,除此之外还没有可能出现其他的问题

    作者回复: 会自动更新位置的 相当于堆中更新一个节点的值

    
     1
  • 短迪大魔王
    2020-02-08
    老师说的这个翻译问题,现在的不管是lstm还是transormer系列的模型的编码整个句子都用到了beamsearch,这个就是考虑了工程上给出的迪杰斯特拉算法,beam一般设置2到4,每一次的结果都是这样,然后取得最后的最优结果,只不过概率是连乘,避免了贪心造成局部最优,翻译效果显著提升
    
    
  • Geek_94adb8
    2020-02-06
    使用内部类,代码的可读性很差!
    
    
我们在线,来聊聊吧