作业帮 > 综合 > 作业

三列数据,需要使三列数据值都平均分配.C语言用什么数据结构好?麻烦给个具体思路!

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/16 11:43:17
三列数据,需要使三列数据值都平均分配.C语言用什么数据结构好?麻烦给个具体思路!
如:第一列 5 8 12 15 16 11 和为:67
第二列 17 21 9 13 12 11 和为:83
第三列 31 5 3 5 7 9 和为:60
三列和的平均值为:70,从各列中拿出1到2个值,把三列都分配成70
·
你的数据都是一组一组的独立数值,分配的依据是数值大小,
所以为了降低复杂度,排序是肯定需要的了,而且是要用C语言,采用物理地址与逻辑地址有映射关系的数据结构可以简化索引过程
综上所述,我认为你这个问题用“数组”就可以很好的处理
但从你这问题的描述来看,你似乎连打算采用什么分配算法都没确定,采用什么数据结构通常应该结合目标数据以及算法才能决定,如果没有基础结构可以胜任,再根据具体需要自己建一个数据结构
再问: 我现在就是不知道用什么分配算法,可以把3列数据分配均匀(可以不是完全的平均,在平均值附近就行),其他的都可以解决
再答: 那要先定义清楚最优解,以及算法的最终目标: 在解不唯一的情况下,你是只要一个解,还是要全部解? 在最优解不存在的情况下,你如何定义其他解的优劣? 对你这个来说就是等于70的个数?或者方差? 例如:70,70,70,1,139 和 69,69,69,72,71 还有就是你的问题是从“各列中拿出1~2个值”,这是必须要挪动1个或2个的意思吗?可以不放回吗?挪完之后还要保证每一列中数量不变吗? 这些问题确定后,才能帮你写算法
再问: 从各列中拿出1~2个值是指拿出2个值后,能满足各列都变成平均值。不是必须要挪动的,也可以拿出更多的值,但是值不能拆分。 如上面第三列比平均值少10,而第二列中有数据9和11,都趋近于10,则取小的数据9。 意思就是各列中的数据不能拆分,各列中数据的数目可以不同,如上面拿出9后,第二列数目为5,第三列数目为7。
再答: 这代码有一定工作量,所以为了避免写了一堆对你没用的东西, 麻烦你准确点的一一回答以下几个问题,你的例子中仍然有很多模糊不清的定义,所以请先别举例子了。 问题: 1、在解不唯一的情况下,你是只要一个解,还是要全部解? 2、在最优解不存在的情况下,你如何定义其他解的优劣?是等于70的个数?还是方差? 3、是否存在匹配的优先级?比如一、三都低于均值10,二高10,且有一个10,这个10如何分配,是给一还是三? 4、是仅仅考虑3个数列之间的分拣吗? 5、分配之后,数列中原有的数据顺序能否更改?
再问: 解不唯一情况下,只需要一个解 不存在最优解,是方差 匹配优先级的话,可任意分配,只要能达到三个数列总和趋近于平均值 只考虑3个数列之间的分拣 分配之后,数列中原有的数据顺序可以更改
再答: 先给你两个思路 第一种办法,穷举法: 排列所有能够使得结果更优的操作序列,并计算每一个结果的方差 优点:依靠嵌套的循环,代码结构较简单,计算结果更全面,一定能够获得最优解 缺点:只要序列内容稍微长一点,时间消耗就会成天文增长,不适合大数据, 目测估计能达到cO(n^n)的复杂度 但是由于操作序列的长度你并不确定也没限定,所以想要让操作序列函数收敛(即基于当前操作序列,所能执行的所有可以让结果更优的后序操作不存在),需要巨大的计算量,如果你认为这种办法比第二种思路好的话,咱再细聊 第二种办法,暂时叫递归优化法吧,因为这是用到的主要结构 优点:计算量小,可以快速优化目标序列 缺点:优化幅度与初始化方法有关,无法确认所得结果是否是最优解 思路: 设三个序列分别为a、b、c,各序列自己的和与均值的差分别为ax、bx、cx 这三个数有一个特点: 1、其中两个一定是同符号 2、而另外一个,一定与这两个符号相反 3、符号相反的那个数的绝对值一定是三个绝对值中最大的,即与均值相差最多的 因此从该序列中取出数字放入另外两个序列中,可以最快速的优化结果 用数学语言描述就是,每一次递归的目标是让|ax| + |bx| + |cx| 用下降最快的方式,挪动数据 也就是梯度下降算法的核心思想 然后将挪动后的三个序列作为新的目标,重新计算ax'、bx'、cx',接下来就是重复的递归操作了,直到|ax| + |bx| + |cx|无法再得到降低,此时的三个序列就是整理之后的结果 算法描述如下: 排序(a、b、c); //可以有效降低比较次数 int weight; //|ax| + |bx| + |cx| 递归优化(a、b、c){ 计算ax、bx、cx; 计算MAX(|ax|, |bx|, |cx|); 循环(each in |MAX|序列){ 查找与剩下的两个|?x|最接近的值; 分别挪到剩下两个序列中; } int tempWeight = 当前的|ax| + |bx| + |cx|; if((tempWeight = weight) || (tempWeight > weight)) 递归终止; else 递归优化(a, b,c); }
再问: 假如循环里|MAX|序列中的值需要2个或更多之和才能满足另外序列的|?x|,这种情况的每个序列的循环量复杂度又怎么最优化呢? 每个序列中的数值不会大于200个
再答: 你所考虑的第一个其实在递归的过程中已经完成了: 假如需要两个或更多的数才能满足|?x|时,且在|MAX|中存在这样的数时,如果我们只取出了与|?x|最接近的数挪过去,那么下一次递归时,就必定是去挪剩下的那个或那些数; 每次我设定只取一个数挪过去是出于两个目的: 一、需要挪多个时只是多递归几次,代价不大; 二、平滑这个优化的过程,假如加入阀值的概念,即|ax|+|bx|+|cx|