使用框架的Random
课程,我想出了一些懒惰的实现方法来改组一副卡片。
我估计下面代码的最坏情况复杂度为O(N + NlogN)。我是对的吗?
数据结构
enum SuitType
{
Diamond,
Heart,
Spade,
Club
}
class Card
{
public SuitType suitType;
public int value;
public int randomOrder;
}
- 我在每张卡片上添加了一个变量randomOrder。
- 然后我使用Randome.Next()获取每张卡的随机数。
- 根据此随机数对卡座进行排序。
醇>
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++;
}
}
}
}
答案 0 :(得分:2)
您可以使用
替换ShuffleDeck
方法的整个主体
return deck.OrderBy(d => r.Next());
这可能不会影响算法的复杂性,但它会使方法更简单。
我的观点是,在Big-O符号方面的思考与此无关,除非你必须洗牌数百万的套牌并发现性能确实是一个问题。