2012-08-23 61 views
5

我想要做的是构建一个包含独特元素的堆栈。一堆独特元素的容器

如果一个元件被推向这已经在堆栈中的元件没有被按下,但现有elemetn应该被移动到堆栈的顶部,即 ABCD + B> ACDB

我想在这里从你哪个容器将是具有此功能的最佳选择。

我决定在列表中的用户栈适配器,因为

  1. 列表并提供恒定的时间元素移动
  2. 列表是堆栈中的原生支持的容器之一。

我选择的缺点是我必须手动检查重复的元素。

P.S.我的编译器不是那么近,所以请不要建议unordered_set。

+2

即使没有最近的编译器,你仍然可以使用[boost :: unordered_set](http://www.boost.org/doc/libs/release/doc/html/boost/unordered_set.html)(不是它看起来好像适合于这项任务)。 – Mankarse

+0

感谢提升解决方案,但我想在这里从stl – deimus

+0

smth如果'unordered_set'是一种可能性(除了编译器支持),为什么不使用正常的'std :: set'呢?但是你看看它,'std :: list'是最糟糕的解决方案。甚至不要考虑它。 'std :: vector'将会更有效率。 –

回答

5

基本上你必须选择恒定时间移动+长搜索,或恒定时间搜索+长时间移动。

很难说哪个会比较费时,但考虑到这一点:

  • 你将不得不寻找,如果该元素存在一次尝试添加元素
  • 你将而不是每次都必须移动元素,因为显然在某些时候您将添加对容器“新”的元素。

我建议你存储元素及其栈位置在不同的容器。以提供快速搜索的方式存储元素,以提供快速移动的方式存储堆栈位置。连接两个指针(这样你就可以知道哪个元素位于哪个位置,哪个位置可以容纳哪个元素 - 杂乱的短语,我知道它!),并且你会执行的东西相当快。

+0

感谢您的回答!我喜欢你的解决方案。基本上堆栈中元素的数量不会超过20个,并且元素比较应该是整数的单个比较。所以我想列表就足够了这个权利? – deimus

+0

@deimus,是的,对于如此少量的数据,您不会看到任何区别是性能,所以没关系。 – SingerOfTheFall

+1

@deimus:对于20个整数,使用'std :: vector'和一个线性搜索。它将适合单块内存(由矢量保证),因此只需一行CPU高速缓存。这可能是最快的解决方案(即使搜索在理论上是线性的)。 –

1

根据您的要求,在我看来,您想要的结构可能来自Max Heap

如果不是仅存储该项目,而是存储一对(生成,项目),并且生成来自单调增加的计数器,那么堆的“根”始终是最后一个可见元素(以及其他元素真的不重要,是吗?)。

  • 流行:在堆中典型弹出操作(delete-max操作)
  • 推送:修改操作,以结构中占“项目”的唯一性
    • 查找“项”,如果找到更新其代(increase-key操作)
    • 如果没有,将其插入(insert操作)

鉴于元素数量(20),在vector上构建堆似乎是一个自然选择。