这是一种情况。例如,我有一个这样的结构(代码简化):
class Dominoe
{
ctor Dominoe(left, right)
string LeftSide;
string RightSide;
}
我有数据,有点像这样:
Dominoe("2", "3"), Dominoe("1", "2"), Dominoe("4", "5"), Dominoe("3", "4")
我知道多米诺骨牌中没有任何差距,也没有重复。 我需要订购这个集合,所以每个RightSide都会连接到相应的LeftSide。像这样:
Dominoe("1", "2"), Dominoe("2", "3"), Dominoe("3", "4"), Dominoe("4", "5")
值 - 不是数字。只需要一个线索。
现在我已经分两步完成了这项任务。小学 - 我正在寻找切入点。拥有LeftSide的多米诺骨牌没有出现在任何其他Dominoe RightSide中。之后我用0索引项切换它。其次 - 我正在寻找下一个多米诺骨牌,其中左侧与我的入口多米诺骨牌的右侧相同,以及周期等等。
我在C#中这样做,但这并不重要。
问题是 - 我不认为它是最好的算法。任何想法都会很棒。 THX。
已编辑!
谈论数字是不好的。
让我们更换Dominoe for trevel cards。
所以它会像:
TravelCard ("Dublin", "New York"), TravelCard ("Moscow", "Dublin"), TravelCard ("New York", "Habana")
答案 0 :(得分:2)
除非您有大量的卡,否则您的解决方案将起作用。否则,您可以考虑使用2个词典来使搜索常量保持O(N)
复杂度:
namespace ConsoleApplication
{
public class Dominoe
{
public Dominoe(int left, int right)
{
LeftSide = left;
RightSide = right;
}
public int LeftSide;
public int RightSide;
}
class Program
{
static void Main(string[] args)
{
var input = new List<Dominoe>()
{
new Dominoe(2, 3),
new Dominoe(1, 2),
new Dominoe(4, 5),
new Dominoe(3, 4)
};
var dicLeft = new Dictionary<int, Dominoe>();
var dicRigth = new Dictionary<int, Dominoe>();
foreach (var item in input)
{
dicLeft.Add(item.LeftSide, item);
dicRigth.Add(item.RightSide, item);
}
Dominoe first = null;
foreach(var item in input)
{
if (!dicRigth.ContainsKey(item.LeftSide))
{
first = item;
break;
}
}
Console.WriteLine(string.Format("{0} - {1}", first.LeftSide, first.RightSide));
for(int i = 0; i < input.Count - 1; i++)
{
first = dicLeft[first.RightSide];
Console.WriteLine(string.Format("{0} - {1}", first.LeftSide, first.RightSide));
}
Console.ReadLine();
}
}
}