关于堆优化的时间复杂的和普通dijkstra时间复杂度的讨论
一.普通dijkstra:
需要每次用循环遍历一遍所有为使用的点来更新离当前起点最近的结点。
假设有v个点,需要找遍v个,总共需要找v次 故时间复杂度得要v²
二.堆优化
原来的遍历找最近点变成了直接从堆里取,时间复杂度为
log(v),同时将点插入目标队列复杂度也是log(v)
一共要找v个点,所以取最小值共需要v*logv(v)
一共插入的次数是边的个数,假设一共有E条边,
则插入需要的时间 为E * log(V)
总时间复杂度为log(V)*(E+V)
至于为什么堆里插入和取top元素时间复杂度为log(n),
因为堆的数据结构是一颗完全二叉树,
一共log(n)层,插入和取都取最坏情况只需要log(n)次即可,
比如一颗三层高的堆,需要往底部插入一个数只需要遍历log(x)=3次就可以了。
代码
blablabla