随机播放卡,dotnet方式!!,算法的复杂性是否可以接受?

时间:2013-09-15 12:23:11

标签: c# algorithm

使用框架的Random课程,我想出了一些懒惰的实现方法来改组一副卡片。

我估计下面代码的最坏情况复杂度为O(N + NlogN)。我是对的吗?

数据结构

enum SuitType
{
    Diamond,
    Heart,
    Spade,
    Club
}

class Card
{
    public SuitType suitType;
    public int value;
    public int randomOrder;
}
  
      
  1. 我在每张卡片上添加了一个变量randomOrder。
  2.   
  3. 然后我使用Randome.Next()获取每张卡的随机数。
  4.   
  5. 根据此随机数对卡座进行排序。
  6.   
class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();

            List<Card> deck = new List<Card>(52);

            p.InitializeDeck(deck);
            List<Card> shuffledDeck = p.ShuffleDeck(deck).ToList();
        }

        Random r = new Random();
        readonly int RMIN = 1, RMAX = 100;

        //O(N + NlogN)
        private  IEnumerable<Card> ShuffleDeck(List<Card> deck)
        {
            //O(N)
            foreach (var d in deck)
            {
                d.randomOrder = r.Next(RMIN, RMAX);
            }
            //O(NlogN)
            return deck.OrderBy(d => d.randomOrder);
        }

        private  void InitializeDeck(List<Card> deck)
        {
            int suitCounter = 0;
            for (int i = 1; i <= 52; i++)
            {
                deck.Add(new Card
                {
                    suitType = (SuitType)suitCounter,
                    value = i,
                    randomOrder = r.Next(RMIN, RMAX)
                });

                if (i % 13 == 0)
                {
                    suitCounter++;
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

您可以使用

替换ShuffleDeck方法的整个主体
return deck.OrderBy(d => r.Next());

这可能不会影响算法的复杂性,但它会使方法更简单。

更新

我的观点是,在Big-O符号方面的思考与此无关,除非你必须洗牌数百万的套牌并发现性能确实是一个问题。