【问题标题】:Type of implementation used? [closed]使用的实现类型? [关闭]
【发布时间】:2016-06-27 19:36:13
【问题描述】:

有一个问题我一直试图解决一段时间,但我很难掌握正确的实现方法。如果我们编写一个程序来处理数千条记录,每条记录都包含产品名称、类型、序列号、零售价格等。在下面的每种情况下,说明您将使用哪种抽象数据类型(队列、堆栈、未排序和排序列表) ,以及哪个实现(数组或链接结构)。简要说明您的选择。

1) 将按照它们存储的顺序检索记录。没有提前告知将处理多少记录以及如何处理。

  • 我更喜欢使用链表实现的未排序列表,因为我们不知道开始时的记录数,并且数据将在存储时被检索,因此它们必须链接,这也可以通过 ADT 来实现队列或堆栈,但它们使用数组实现,因此出现内存分配问题。

2) 所有记录都将在开头插入一次,不按特定顺序插入。它们将根据序列号被非常频繁地检索。

  • 即使在一次打印所有记录数据的情况下,也可以使用未排序列表。

3) 将在需要时插入大量但未知数量的产品记录。他们很少单独检索。大多数操作将包括一次性处理所有记录,例如全部打印。

  • 不过,此处排序和未排序列表的使用效率更高,但我更喜欢未排序列表,因为排序需要时间,这会降低效率。

你们觉得呢?

【问题讨论】:

  • 提示:列表几乎总是错误的答案。而且您关于基于数组的堆栈和队列的假设是错误的。
  • 如果这不是教科书/考试问题,而是现实世界的问题,请遵循 Stroustrup 的建议并从向量开始。两个字解释为什么:缓存效应。
  • @lorro 这是我今天一直在解决的教科书问题。
  • 顺便说一句,并不是 StackOverflow 上的每个人都是“人”:)
  • @AliShamsi: C++ std::deque 管理许多较小的连续区域,为满足 1) 中的需求提供了 listvector 属性的两全其美的混合体.对于 2),将元素放入 vector,然后按序列号对其进行排序,这样您就可以执行 std::binary_searchs 了,就像使用 mapunordered_map 一样。未排序的列表很糟糕,因为您需要在每次检索期间进行线性搜索。 3) vector 具有连续内存/缓存位置与偶尔调整大小的优势,而list 具有更可预测的插入成本,deque 又是一个很好的混合体。

标签: c++ data-structures abstract-data-type


【解决方案1】:

想想每个数据结构的用途以及问题中提供的访问模式以及一和二的答案是不言而喻的。第三个有点棘手,但你所掌握的信息是,除了很有可能使用所有这些数据之外,你没有关于如何使用这些数据的信息。

队列

队列是一个管道。东西以相同的顺序进入一侧并从另一侧出来(先进先出,AKA FIFO)。除了即将出来的项目之外,您可能会也可能不会看到队列中的任何内容。换句话说,为了查看队列中的下一个项目,您必须删除当前项目。搜索是一个非常糟糕的主意,因为您可能无法搜索它,除非将所有内容都取出并重新放入。

堆栈

堆栈就是这样。一堆东​​西。你把东西放在堆上,然后你把东西从堆里拿出来。事物以与放入的相反顺序从堆栈中出来。这是先入后出或 FILO。同样,除了堆栈中最顶层的项目之外,您可能什么都看不到,因此要获得下一个项目,您必须删除最顶层的项目。出于与队列相同的原因,搜索是一个坏主意。

未排序列表

任何东西都可以放在任何地方。把东西放进清单是轻而易举的事,因为你不在乎它的去向。在列表中查找东西......这太糟糕了。您实际上必须逐个查看每个项目(线性搜索),直到找到您要查找的内容。如果您不关心列表中的内容并且永远不必搜索它,那么这就是您的数据结构。至少在您收集和使用统计数据并找到一些优化之前。

排序列表

根据某些指定的模式,一切都在它的位置。这使得查找东西变得非常容易。有可能您可以直接找到所需的项目,如果不是,您通常可以一遍又一遍地细分列表,因为如果该项目不在您选择的任何地方的一侧,则它必须在另一侧(二分搜索) .查找很容易,但无论您插入什么,都必须小心放置,这可能非常昂贵。但如果你建立一次列表然后反复搜索它,你几乎总是会领先。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多