免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4115 | 回复: 19
打印 上一主题 下一主题

[算法] 一道算法题,求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-04 21:30 |只看该作者 |倒序浏览
项目中碰到一个问题,抽象为如下模型:

有若干个输入数组(数组元素不重复):
        1、5、3、4、2
        3、4、1
        2、1、4、3
        1、5、2
        2、3、5、1
        4、2、3
        3、1、5


要求输出一个包含上面所有的数组的元素,并保持其相对顺序不变的 综合数组,元素个数尽可能的少
       
例如,结果可能是这样的
        4、2、1、5、3、5、4、3、1、2、5  (在结果数组中,能找到输入的每一个序列)
或者        3、2、1、5、3、4、2、3、2、5、1

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2010-02-04 22:32 |只看该作者
相对顺序是什么意思,沒懂得~~
如果已知數組內容的范圍,可以用Mark大法。比如數值在0~1000時,可以定義:
int tag[1000],result[1000];
再:
for(每個dimm)
for echo member
  if(tag[dimm[index]]==0){ //新成員
     result[iResult++]=dimm[index];
     tag[dimm[index]]=1;

  
完畢~~

论坛徽章:
0
3 [报告]
发表于 2010-02-04 23:11 |只看该作者
可以用链表或者树来做!

论坛徽章:
0
4 [报告]
发表于 2010-02-05 11:01 |只看该作者
好难啊这道题目?不知道有什么构造方法不?是不是NPC来的?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2010-02-05 13:51 |只看该作者
好难啊这道题目?不知道有什么构造方法不?是不是NPC来的?
ailyanlu 发表于 2010-02-05 11:01

应该不是NP级别的,多项式时间内无法检验.

论坛徽章:
0
6 [报告]
发表于 2010-02-05 14:50 |只看该作者
贪心可能就足够好了?两两之间是 Shortest common supersequence 问题,用DP.

论坛徽章:
0
7 [报告]
发表于 2010-02-06 14:59 |只看该作者
DP应该是不行的,最优解不包含子问题的最优解

论坛徽章:
0
8 [报告]
发表于 2010-02-06 16:49 |只看该作者
本帖最后由 NalaGinrut 于 2010-02-06 16:54 编辑

一个串压缩问题,将所有的串压缩为一个串,但每个串都可以在这个压缩串中被搜索到。不知道楼主是不是用来做搜索的?


给一个简单的算法,最坏情况空间复杂度为:串最大长度*串数目,时间复杂度感觉也不是太大,我估摸着楼主既然是要串压缩,可能更注重空间复杂度。不能保证最优解,且每次只能得到确定的压缩串。
令a_i(i=0,1,2...)为串集合A中所有待压缩的串,b为已经压缩好的串,设立松散匹配函数func,松散匹配只保证b中存在与a_i中对应元素排列次序完全相同的元素序列,但不保证元素连续出现。伪C定义如下:
func(a,b)
{
while( b != END)
{
  if(a == b)
       a=a.next;//匹配到串a中一个元素,则比较下一个;
  if(a == END)
       return OK;//如果a先于b结束,则b中存在a的一个松散匹配,返回OK;
  b=b.next;
}
return a.rest;//b先于a结束,则b中不存在a的一个完整松散匹配,这时候返回剩下的a元素;
}

算法如下:
1、从A中任取a_i,若A为空,则执行4;
2、调用func(a_i ,b),若返回值为OK,则执行1,否则执行3;
3、将func返回的部分合并到b的末尾,执行1;
4、返回串b,为已压缩好的串。


PS:如果想得到不确定的压缩串,可以加入随机处理,可以进行随机插入。
      不能保证最优解,因为松散匹配时不会进行折返,这个松散匹配算法比较简单。但是可以保证在当前a_i在b中已经匹配到的元素不会重复插入。

论坛徽章:
0
9 [报告]
发表于 2010-02-06 20:36 |只看该作者
楼上的兄弟的算法是最简单的,但得到的解比较差
就我举的例子,用已研究出来的一个复杂度很高的算法
得出的比较好的解是 9个元素 2 3 1 5 3 4 2 3 1
不知有没人能想出更好的

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2010-02-06 20:40 |只看该作者
楼上的兄弟的算法是最简单的,但得到的解比较差
就我举的例子,用已研究出来的一个复杂度很高的算法
得出 ...
ogmw 发表于 2010-02-06 20:36


这个问题不像是一个NP问题,如果要严格最优解的话,复杂度我想应该是比较高的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP