You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

近邻算法与贪心算法的差异解析及TSP场景实例说明

嘿,这个问题太典型了——刚接触TSP的同学几乎都会把这俩算法搞混,我来给你把逻辑掰扯清楚,再拿具体例子说透~

核心差异:决策逻辑的出发点完全不同

你之前的误区是只看到了「选最短路径」这个表面行为,但两者的决策逻辑本质上是两回事:

  • 近邻算法(Nearest Neighbor):是「当前位置驱动」的局部贪心。每一步的选择只盯着「我现在站的这个城市,到哪些没去过的城市最近」,完全不考虑其他城市之间的边有多短,也不关心全局的路径结构,属于走一步看一步的“鼠目寸光”型选择。
  • TSP贪心算法(通常指Edge Greedy):是「全局边驱动」的贪心。先把所有城市间的边按长度从小到大排好序,然后从最短的边开始挑选,挑选时只遵守两个规则:① 每个城市最多连2条边(因为TSP是环,每个城市只能进一次、出一次);② 不能提前形成闭合的小环(否则就没法把所有城市连起来了)。整个过程不关心“当前在哪”,只关心边的长度和合法性,属于先攒一堆好货再拼拼图的“全局规划”型选择。

用实例看两者的决策差异

假设我们有5个城市:A、B、C、D、X,它们的距离如下:

  • A-B: 1,A-X: 100
  • B-C: 100,C-D: 1
  • D-X: 100
  • A-C: 2,B-D: 2,其余边均为100

近邻算法的决策过程(以A为起点)

  1. 站在A,扫一遍未访问的城市:B(距离1)、C(2)、D(100)、X(100)→ 选最近的B,走到B。
  2. 站在B,扫未访问的城市:C(100)、D(2)、X(100)→ 选最近的D,走到D。
  3. 站在D,扫未访问的城市:C(1)、X(100)→ 选最近的C,走到C。
  4. 站在C,只剩X没去过,只能走到X(距离100)。
  5. 最后从X返回A(距离100)。
    → 最终路径:A→B→D→C→X→A,总长度:1+2+1+100+100=204。

贪心算法的决策过程(边贪心)

  1. 先把所有边按长度排序:A-B(1)C-D(1)A-C(2)B-D(2)、其余均为100。
  2. 开始挑选边:
    • 先选A-B(1):A和B各连1条边,符合规则(每个城市最多2条边,且没形成环)。
    • 再选C-D(1):C和D各连1条边,同样合法。
    • 接下来看最短的A-C(2):但如果选它,A和C的边数都会达到2(满额),这样就形成了A-BC-D两个独立的小片段,X根本没法加进来,所以不能选这条边
    • 再看B-D(2):选它的话,B和D的边数也会满额,同样会把A、B、D和C分成两个片段,X还是加不进来,也不能选。
    • 没办法,只能选能连接片段和X的边:先选C-X(100)(C边数满额,X连1条),再选A-X(100)(A边数满额,X边数满额),最后选B-D(2)把剩下的B和D连起来。
      → 最终路径同样是A→B→D→C→X→A,总长度一样,但你看,贪心算法是先挑所有短边,再想办法把所有城市串起来,完全没有“当前位置”的概念,和近邻算法走一步看一步的逻辑完全不同!

额外差异:路径对起点的依赖

还有一个明显的区别:

  • 近邻算法的路径严重依赖起点,换个起点可能会走出完全不同的路径(比如刚才的例子,如果起点是X,路径会变成X→A→B→D→C→X,虽然总长度一样,但顺序完全反过来)。
  • 贪心算法的路径不依赖起点,它只看所有边的长度排序,最终生成的环结构是固定的(只是遍历方向可能不同)。

内容的提问来源于stack exchange,提问作者Çağatay Şen

火山引擎 最新活动