【问题标题】:Linked List vs. Dynamic array for implementing a deck of cards? C++ [closed]用于实现一副纸牌的链表与动态数组? C++ [关闭]
【发布时间】:2014-07-16 22:54:21
【问题描述】:

实现万智牌或口袋妖怪纸牌游戏哪个更好? 我听说链表在从牌组中添加/删除卡片时更快更有效;不过,我听说动态数组搜索特定卡片的速度更快。

你知道洗牌哪个更快吗?

那你觉得我应该用哪个来制作像精灵宝可梦tcg这样的游戏http://hum1l1ation.hubpages.com/hub/PlayPoketcgDummy

我可以同时使用两者,还是一副牌可以只是堆叠?

到目前为止,我的设计将是卡组类中卡片类的动态数组。

【问题讨论】:

  • 你衡量链表的实现与动态数组的实现,然后你决定。
  • 如果一副牌中只有 50 或 100 张卡片(或只有 1000 张),那么这两种数据结构都会非常快,以至于您永远不会注意到差异。这完全是错误的优化方式。
  • std::deque 实际上可能是这里选择的数据结构。
  • @Brian:顺便说一下,大多数deque 实现都使用数组的链表。
  • 甲板上的顺序重要吗?你需要随机访问吗?基本上,数据结构选择是一个庞大而复杂的话题。我们可以回答诸如“哪个更快洗牌”之类的个别问题,但总体上应该选择哪个则不太清楚,这仅仅是因为当您传达了影响该决定的所有信息时,您已经超出了问题的范围,它' 也会“过于本地化”(因为它几乎是“请为我解决这个确切的晦涩问题”)。 That said, when the choice is array versus linked list, std::vector is a good default.

标签: c++ dynamic linked-list stack


【解决方案1】:

有多少张牌?每个卡片入口有多大?除非抄袭 非常昂贵(然后,如果你有 C++11,你应该 能够使用移动语义),std::vector 将是最好的 关于性能的选择(不是它可能会做出 对用户来说有很大的不同)。大部分经典 big-O 分析因内存不足而失效 访问不是固定时间,而是取决于地点;越少 你使用的总内存,你的代码运行得越快。今天, 关于使用std::list 的唯一原因是额外的 保证它提供关于有效性的 迭代器。

【讨论】:

  • 当然,不是每个链表都像std::list。侵入式链表通常具有更好的常数因子,可以更方便,并且不需要对某些操作进行昂贵的搜索。此外,“您使用的总内存越少”也不是衡量局部性的好方法。当然,相同算法的更少内存会略微增加缓存命中的几率,但以更智能的顺序访问相同数量的内存(即针对局部性而不是大小进行优化)通常会产生更大的影响。
  • 天啊,我爱你们!我现在很乐意使用向量!我不知道 std::deque 存在。当您从事代码项目时,有 SO 支持您非常有动力。
  • @delnan 本地化当然是真正的目标。改善局部性的最简单方法之一是减少分配的数量,将逻辑上相邻的元素放在内存中相邻。但当然,不同的编程技术也会对其产生影响:二分搜索的局部性比线性搜索差(但在这种情况下,big-O 的差异足以超过它),对向量进行三遍也是如此,什么时候做。
【解决方案2】:

就性能而言,对于少于 100 张卡的牌组,您可能不会看到太大的差异。

此外,如果您使用的是 C++11,标准库中包含对向量进行洗牌,并且非常高效:

void shuffle()
{
    std::random_device rd;
    auto seed = rd();
    std::mt19937 g(seed);
    std::shuffle(_deck.begin(), _deck.end(), g);
}

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 2014-02-27
    • 2011-11-16
    • 2020-08-07
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多