【发布时间】:2016-06-27 19:36:13
【问题描述】:
有一个问题我一直试图解决一段时间,但我很难掌握正确的实现方法。如果我们编写一个程序来处理数千条记录,每条记录都包含产品名称、类型、序列号、零售价格等。在下面的每种情况下,说明您将使用哪种抽象数据类型(队列、堆栈、未排序和排序列表) ,以及哪个实现(数组或链接结构)。简要说明您的选择。
1) 将按照它们存储的顺序检索记录。没有提前告知将处理多少记录以及如何处理。
- 我更喜欢使用链表实现的未排序列表,因为我们不知道开始时的记录数,并且数据将在存储时被检索,因此它们必须链接,这也可以通过 ADT 来实现队列或堆栈,但它们使用数组实现,因此出现内存分配问题。
2) 所有记录都将在开头插入一次,不按特定顺序插入。它们将根据序列号被非常频繁地检索。
- 即使在一次打印所有记录数据的情况下,也可以使用未排序列表。
3) 将在需要时插入大量但未知数量的产品记录。他们很少单独检索。大多数操作将包括一次性处理所有记录,例如全部打印。
- 不过,此处排序和未排序列表的使用效率更高,但我更喜欢未排序列表,因为排序需要时间,这会降低效率。
你们觉得呢?
【问题讨论】:
-
提示:列表几乎总是错误的答案。而且您关于基于数组的堆栈和队列的假设是错误的。
-
如果这不是教科书/考试问题,而是现实世界的问题,请遵循 Stroustrup 的建议并从向量开始。两个字解释为什么:缓存效应。
-
@lorro 这是我今天一直在解决的教科书问题。
-
顺便说一句,并不是 StackOverflow 上的每个人都是“人”:)
-
@AliShamsi: C++
std::deque管理许多较小的连续区域,为满足 1) 中的需求提供了list和vector属性的两全其美的混合体.对于 2),将元素放入vector,然后按序列号对其进行排序,这样您就可以执行std::binary_searchs 了,就像使用map或unordered_map一样。未排序的列表很糟糕,因为您需要在每次检索期间进行线性搜索。 3)vector具有连续内存/缓存位置与偶尔调整大小的优势,而list具有更可预测的插入成本,deque又是一个很好的混合体。
标签: c++ data-structures abstract-data-type