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

时间:2017-08-07 04:01:20

标签: string algorithm data-structures graph topological-sort

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

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

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

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

供参考:

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

1)字母x出现在y

之前

2)字母y出现在x

之前

3)x和y可以按任何顺序出现

然而,由于1和2不能同时发生,我们有一个DAG(有向无环图)。因此,“尝试在DAG中找到订单”响铃进行拓扑排序。事实上,问题现在非常类似于用于拓扑排序的经典问题,即,我们有一堆任务,任务x应该在任务y之前完成,依此类推,找到有效的任务顺序。

然而,正如生活中的其他所有技能能够区分立即使用的算法一样,是经验和大量练习的结果:)