多任务排序问题

问题描述

有很多任务譬如说100个,要对任务进行排序,做了一系列的调查问卷,目前我们有每两个之间的比较关系,希望的出根据轻重缓急的排序。

但目前不知道所有点之间的关系(问卷只涉及到了一部分),而且里面还会有环(a>b>c>a)

方法简化

可以把这些统计出来的问卷做成一个有向图,每个任务是一个节点,谁大就指向谁,由此我们可以根据图得出一个邻接矩阵。

方案一

邻接矩阵可以很容易化成一个三角矩阵,可以对三角矩阵进行行列式变换;

例子

进行一系列操作的目的是把b行的关系传递给A,这样最后的第一行可以得到他们的关系
譬如要进行的操作是
A +(matrix[0][1] +B)
让A行的C位置(AC)变成-2,就算作把关系传递过去了。

但实际操作遇到了问题,比如0的含义是问卷没有覆盖到,要区分对待,
还有就是和E的关系,会被加成-3,但其实不一定,有可能只是-2
F会被加成负值

方案二
转换成树
找一个作为根,比如第一个值,比他大的是他的父亲,比他小的是他的儿子:
树

这样的话会出现抢夺儿子问题,这个比较好解决,看哪个儿子年龄大做谁的父亲:

例子2

比如A即使上面的父亲也是下面节点的父亲,比他们的年龄就好;
还有,也会出现环的问题,一个节点即使父亲又是儿子,没法解决,只能随机忽略,实验结果不是很好;

方案三:gossip算法
随机初始化1-100,然后遍历邻接矩阵一万次/十万次/五十万次
根据调查问卷统计我们有类似很多的
A>b
A>c
的信息,根据这些条件判定数组arr[0]是否大于arr[1]
如果不是就吧他们连个数交换,循环很多次最后震荡会收敛,也会满足所有条件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机程序设计java语言数字排序问题 计算机程序设计java语言数字排序问题全文共46页,当前为第1页。计算机程序设计java语言数字排序问题全文共46页,当前为第1页。 计算机程序设计java语言数字排序问题全文共46页,当前为第1页。 计算机程序设计java语言数字排序问题全文共46页,当前为第1页。 计算机程序设计java语言数字排序问题 题目:已知数据文件IN10.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序,最后调用写函数writeDat()把数组b中的数输出到OUT10.DAT文件。 1 jsValue() { int i,thou,hun,ten,data,j; for(i=0;i<300;i++) { thou=a[i]/1000; /*取得四位数的千位数字*/ hun=a[i]%1000/100; /*取得四位数的百位数字*/ ten=a[i]%100/10; /*取得四位数的十位数字*/ data=a[i]%10; /*取得四位数的个位数字*/ if (thou-hun-ten-data>0) { b[cnt]=a[i]; cnt++; } } for(i=0;i<cnt-1;i++) /*将数组b中的四位数按从小到大计算机程序设计java语言数字排序问题全文共46页,当前为第2页。计算机程序设计java语言数字排序问题全文共46页,当前为第2页。的顺序进行排序*/ 计算机程序设计java语言数字排序问题全文共46页,当前为第2页。 计算机程序设计java语言数字排序问题全文共46页,当前为第2页。 for(j=i+1;j<cnt;j++) if(b[i]>b[j]) { data=b[i]; b[i]=b[j]; b[j]=data; } } 2 if (thou+data==hun+ten) { b[cnt]=a[i]; cnt++; } } for(j=i+1;j<cnt;j++) if(b[i]>b[j]) { data=b[i]; b[i]=b[j]; b[j]=data; } 3 在文件IN45.DAT中有200个正整数,且每个数均在1 000至9 999之间。函数readDat()的功能是读取这200个数存放到数组aa中。请编制函数jsSort(),该函数的功能是:要求按每个数的后三位的大小进行降序排列,将排序后的前10个数存入数组b中,如果数组b中出现后三位相等的数,则对这些数按原始4位数据进行升序排列。最后,调用函数writeDat()把结果bb输出到文件OUT45.DAT中。 void jsSort() { int i,j,data; for(i=0;i<199;i++) /*对数组中的四位数按后三位进行从大到小排序*/ for(j=i+1;j<200;j++) { 计算机程序设计java语言数字排序问题全文共46页,当前为第3页。计算机程序设计java语言数字排序问题全文共46页,当前为第3页。 if (aa[i]%1000<aa[j]%1000) /*比较每个数的后三位*/ 计算机程序设计java语言数字排序问题全文共46页,当前为第3页。 计算机程序设计java语言数字排序问题全文共46页,当前为第3页。 { data=aa[i]; aa[i]=aa[j]; aa[j]=data; } else if(aa[i]%1000==aa[j]%1000)/*若后三位数相等*/ if (aa[i]>aa[j]) /*则要按原四位数的值进行从小到大排序*/ { data=aa[i]; aa[i]=aa[j]; aa[j]=data; } } for(i=0;i<10;i++) bb[i]=aa[i]; /*将排序后的前10个数存入数组b中*/ } 已知数据文件IN13.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序,最后调用写函数writeDat()把数组b中的数输出到OUT13.DAT文件。 { int i,thou,hun,ten,data,j; for(i=0;i<300;i++) { thou=a[i]/1000; /*取得四位数的千位数字*/ hun=a[i]%1000/100; /*取得四位数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值