首页 文章

在算法中正确使用拓扑排序

提问于
浏览
1

给定具有N个单词的外来语言的排序字典和标准字典的k个起始字母表,任务是完成返回表示该语言中字符顺序的字符串的函数 .

Input:  Dict[] = { "baa", "abcd", "abca", "cab", "cad" }, k = 4
Output: Function returns "bdac" 
Here order of characters is 'b', 'd', 'a', 'c'

我已经通过在线参考一些文章使用 topological sort 实现了问题的解决方案,但没有一个提到他们是如何得出使用拓扑排序的决定的?

Question: 有人可能知道何时使用图形或拓扑排序等概念来解决问题?

For reference:

解决方案是遍历给定的列表并将每个字符串与下一个字符串进行比较 . 每当发现第一个不匹配时,在图形中的两个字符之间添加边缘,然后继续比较接下来的两个字符串 .

图表准备就绪后,应用拓扑排序 .

2 回答

  • 0

    你将不得不练习更多问题并发展直觉来解决问题 . 至于拓扑,你可以从识别一些你可能能够使用拓扑排序的标志开始 .
    1. 标志是 Directed Acyclic Graph (DAG),因为拓扑排序只能应用于DAG
    2. 可以通过某种操作将图形转换为 DAG ,就像您的示例一样 . 有向图可以通过合并其 Strongly Connected Components 转换为DAG,或者可以将问题以某种方式减少到DAG中
    3. 节点之间是否需要某种线性?
    4. 您想找到最短路径(拓扑排序也可用于通过加权有向无环图快速计算最短路径)

    这就是我现在所拥有的,我会在以后继续更新这个答案

  • 0

    实际上,我想到图的方式是它代表对象之间的关系 . 这里,对象是字母表,你试图找出三种情况中的一种(对于两个字母x和y):

    1)字母x出现在y之前

    2)字母y出现在x之前

    3)x和y可以按任何顺序排列

    但是,由于1和2不能同时发生,我们有一个DAG(有向无环图) . 所以,"trying to find an order in a DAG" rings the bell 进行拓扑排序 . 事实上,问题现在非常类似于用于教授拓扑排序的经典问题,即,我们有一堆任务,任务x应该在任务y之前完成,依此类推,找到要完成的任务的有效顺序 .

    然而,正如在生活中的每一个其他技能能够区分立即使用什么算法,是经验和许多实践的结果:)

相关问题