需要对复杂的对象进行排序,例如多米诺骨牌

时间:2016-04-13 12:19:55

标签: c# algorithm sorting

这是一种情况。例如,我有一个这样的结构(代码简化):

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")

1 个答案:

答案 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();
        }
    }
}