如何优化此题的算法?

drizzlecrj 2006-07-07 11:24:55
有一个集合V{0,1,2,3,4,......N} (N<1000)

有一个数组String a[],其中a的元素是由V的子集构成,a的长度为200000;
举例来说
比如 a[0]=1|6|7 (其中|为分隔符)
a[1]=2|10
.
.
.
a[m]=1|2|3|6|7
.
.
.

a[k]=100|101
.
.
.
a[200000]=1|100|101|200
a[m] 中包含了1、2、3、6、7,a[0]中包含了1、6、7,显然a[0]是a[m]的子集,此时则去掉数组元素a[m];
a[k]中包含100、101,a[200000]包含了1、100、101、200,显然a[k]是a[200000]的子集,此时则去掉数组元素a[200000];
也就是说只要数组元素a[i]在a中含有a[i]的子集,则去掉a[i]。
处理完数组a后,输出新的数组。


我的解法一直停留在二重循环上面的局部优化 , 不知道哪位有更好的解法?

我刚开始用过多叉树, 感觉还是不行阿, 郁闷
...全文
537 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztqye 2006-07-07
  • 打赏
  • 举报
回复
对已经生成的数组来说只有循环了,不过要优化的话你可以考虑在数组成员的产生过程使用优化。具体怎么优化要看你是怎么产生数组成员的了。
jixingzhong 2006-07-07
  • 打赏
  • 举报
回复
借鉴 筛选法?
呵呵, 估计农夫基本也是这么弄的吧?

O(n) 似乎有点夸张,
感觉也不可能,
这个数组又不是 “有规则” 的 .....
Dong 2006-07-07
  • 打赏
  • 举报
回复
Mark
jixingzhong 2006-07-07
  • 打赏
  • 举报
回复
原来是 农夫 ...
怎么老是搞算法? 界么深奥的东东 ...
=====================
这个问题似乎必须循环处理
jixingzhong 2006-07-07
  • 打赏
  • 举报
回复
二重循环上面的局部优化
==============
差不多了 ...

healer_kx 2006-07-07
  • 打赏
  • 举报
回复
看到数学符号就难受。。。
Dong 2006-07-07
  • 打赏
  • 举报
回复
使用多叉树可以解决问题

首先:
把输入的内容(“a[m]=1|2|3|6|7”)使用“|”分解后生成树,在生成的过程中进行对比,
比如:
多叉树中有一节点的内容为
(1)
--------------------
(2) (10) (20)
---------
(3) (5)
那么当输入“1|2|3|6|7”时,只要生成(1)-->(2)-->(3)后面的节点(6),(7)就可以。

没次输入的节点对整棵树进行对比,但对比的次数却不是很多,因为,如果是101|102|103|106|107,因为开始没有节点101,那么肯定要在根那里生成一个新的根节点。

对比整个过程跟使用二维数组来对比排列,多叉树那是减了很多工作。

在树生成时,有的节点路径可以合并。
比如:
-------------------------
(2) (100)
---------
(101)

当有新输入2|100|101时,把上面两个节点和起来。

最后,遍历整棵树,生成新的二维数组(结果数组)
Dong 2006-07-07
  • 打赏
  • 举报
回复
使用多叉树可以解决问题

首先:
把输入的内容(“a[m]=1|2|3|6|7”)使用“|”分解后生成树,在生成的过程中进行对比,
比如:
多叉树中有一节点的内容为
(1)
--------------------
(2) (10) (20)
---------
(3) (5)
那么当输入“1|2|3|6|7”时,只要生成(1)-->(2)-->(3)后面的节点(6),(7)就可以。

没次输入的节点对整棵树进行对比,但对比的次数却不是很多,因为,如果是101|102|103|106|107,因为开始没有节点101,那么肯定要在根那里生成一个新的。

整个过程跟使用二维数组对比,操作,那是减了很多工作。

在树生成时,有的节点路径可以合并。
比如:
-------------------------
(2) (100)
---------
(101)

当有新输入2|100|101时,把上面两个节点和起来。

最后,遍历整棵树,生成新的二维数组(结果数组)

powersuite 2006-07-07
  • 打赏
  • 举报
回复
学习
sky4wing 2006-07-07
  • 打赏
  • 举报
回复
弄1000个链表L[1000],L[i]链表保存含有元素i的String a[j]的序号j
先扫描一次String a][,
也不算你这个要用多少时间
sharpdew 2006-07-07
  • 打赏
  • 举报
回复
trie树就够你用了,不过一个集合种的元素排列要有序
Kvci 2006-07-07
  • 打赏
  • 举报
回复
可以近视地看成是O(2n)拉
Kvci 2006-07-07
  • 打赏
  • 举报
回复
那样就不用O(n^2)拉
哈哈
Kvci 2006-07-07
  • 打赏
  • 举报
回复
弄1000个链表L[1000],L[i]链表保存含有元素i的String a[j]的序号j
先扫描一次String a][,
再对L[1000]处理。比如L[1]保存了含有1元素的所有数组的下标,那就只要检查那几个下标的数组是否怎么样拉

64,682

社区成员

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

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