gpt4 book ai didi

c# - 洗牌,dotnet 方式!!,算法的复杂度是否可以接受?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:47:38 28 4
gpt4 key购买 nike

使用框架的 Random 类,我想到了以下惰性实现来洗牌。

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

数据结构

enum SuitType
{
Diamond,
Heart,
Spade,
Club
}

class Card
{
public SuitType suitType;
public int value;
public int randomOrder;
}
  1. I have added a variable randomOrder with each card.
  2. Then I am using Randome.Next() to get a random number for each card.
  3. Sort the deck based on this random number.
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++;
}
}
}
}

最佳答案

您可以将 ShuffleDeck 方法的整个主体替换为

return deck.OrderBy(d => r.Next());

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

更新:

我的观点是,除非您必须洗牌数百万套牌并发现性能确实是个问题,否则用 Big-O 符号来思考在这里并不重要。

关于c# - 洗牌,dotnet 方式!!,算法的复杂度是否可以接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18812323/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com