问一个和数据结构的问题

intersun2 2009-09-04 02:39:15
要存好多数(int),把他们存入数据结构,然后进行以下几种运算。

合并两堆数,
分开一堆数,
随机选两堆数,然后在两堆数中任选两个交换。
其中交换要进行n^2次,另两种运算要进行n次

如果就用两维数组的话(一维代表一堆数,这样最多可以表示n堆),合并要把第二堆数存进第一堆,分开的话也要把分开的那堆存入另一个数组,但是交换代价比较低,
如果用链表的话合并代价低,但是交换代价高。

有没有一个比较折衷的结构降低代价要求?貌似vector合并代价也一样高。
...全文
71 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
intersun2 2009-09-04
  • 打赏
  • 举报
回复
list对于交换的运算好像不太好。而且运算是这样的:
for ( int i=0; i<n; i++ )
{
做合并或者分裂运算(随机的,各50%概率)
for(int j=0; j<n; j++)
做交换运算
}
也就是合并或者分裂各作大概n/2次, 交换做n^2次,而且是混合的。所以交换比较重要,我写的用数组(vector一样)要快些。
就想问问有没有个结构能同时满足这几个运算都比较快哈。。。ms比较困难。。。速度提升也不会很大。。。
嗯,过一会继续问问题,还是同一个算法,不过更重要一点,希望各位继续能够给出意见哈。
谢谢大家。
beyond071 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yimsungnam 的回复:]
不管是合并还是分割, 都要进行复制原有数据, 如果连这复制的工作都觉得费效率, 那怎么做呀?

就算用链表, 比如A并B, 那就是把B的数据复制到A的后面, 或是生成一个新的C 再 A+B.

没法把复制这个操作去掉呀
[/Quote]
list的优点就在合并上了,使用list::splice(),所花费的不过只是指针的移动罢了,并没有复制
acrobatyuer 2009-09-04
  • 打赏
  • 举报
回复
list就OK啦!~~~

直接插入或erase可以吗???
Marshall 2009-09-04
  • 打赏
  • 举报
回复
不管是合并还是分割, 都要进行复制原有数据, 如果连这复制的工作都觉得费效率, 那怎么做呀?

就算用链表, 比如A并B, 那就是把B的数据复制到A的后面, 或是生成一个新的C 再 A+B.

没法把复制这个操作去掉呀
cphj 2009-09-04
  • 打赏
  • 举报
回复
开销上,list基本相当于链表,vector基本相当于数组

要想在时间效率上提升,只能用空间来换取

最简单的做法就是先用链表存储,进行合并、分开运算
在进行交换操作之前,把链表中的所有数复制到等价的数组中去
herman~~ 2009-09-04
  • 打赏
  • 举报
回复
建议还是用stl容器吧

相关的算法google之
intersun2 2009-09-04
  • 打赏
  • 举报
回复
合并没有要求,就是选两个合并到一起。 比如
a1: 1 2 3 4 5
a2: 6 7 8 9 10
a3: 11 12 13 14
a4: 15 16 17 18 19 20 21 22 23

要合并第一个和第二个就变成
a1: 1 2 3 4 5 6 7 8 9 10
a2: 11 12 13 14
a3: 15 16 17 18 19 20 21 22 23

在继续分裂第三个(随几选一点,比如从第4个点分开),就变成
a1: 1 2 3 4 5 6 7 8 9 10
a2: 11 12 13 14
a3: 15 16 17 18
a4: 19 20 21 22 23

beyond071 2009-09-04
  • 打赏
  • 举报
回复
合并 分开 都有什么具体要求?
从描述的要求上看 或许list可以满足

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧