这个问题听起来像是这样,我们会收到n-texts文件,然后将它们放在磁带/带子/乐队上(不要真正知道英语中的等价物,' s 但我想你明白我在说什么。为了读取位于位置k的文本,我们必须阅读位置1,2,...,k的文本 每个文字都有它的'自己的长度和频率(读取的次数)。现在,我们必须提出一个解决方案,按照这样的顺序放置文本 总访问时间最短。 计算总访问时间的公式为:
n_
\ f(Ti)[L(T1)+L(T2)+...+L(Ti)]
/_
i=1
现在,我做的那张小画是从1到n的SUM;
f(T i)是T i的频率;
L(T i)是T i的长度;
T i是位于i位置的文本;
这是"伪代码"如果它有帮助:
n-number of texts;
Ribbon[n]-array of texts
sum=0, sum2=0;
for(i=0;i<n;i++)
{sum=0;
for(j=0;j<=i;j++)
sum=sum+Ribbon[j].length;
sum2=sum2+sum*Ribbon[i].frequency;}
现在我尝试了几种策略,比如根据长度,频率,甚至长度*频率以及其他一些想法,按升序/降序对文本进行排序,而不是他们总是找到一个反例,一个元素序列的总访问时间比我的程序给我的要少。
答案 0 :(得分:2)
如果我们交换两个相邻元素x和y(其中x当前位于y之前),则考虑总和的变化。
您会发现差异为f(Tx)L(Ty)-f(Ty)L(Tx)
。
例如,如果两个长度相同,那么如果我们更早地设置更高的频率,我们会减少总和,而如果频率相同,如果我们更早地设置较短的长度,我们会减少总和。
我们可以通过交换相邻元素来达到任何排列(例如考虑冒泡排序),因此如果您根据此比较函数对元素进行排序,您将获得最小总和。
请注意,此比较函数等同于基于L(Tx)/f(Tx)
的排序,即我们希望首先完成短/高频元素。
答案 1 :(得分:0)
对于第一部分,我根据L(Tx)/ f(Tx)命令它们,就像Peter de Rivaz说的那样,它起作用了。
编辑:
然而,这个问题有一个转折,如果你愿意的话,这是第二部分。它是这样的:我们仍然得到n文本,但这一次,文本只有长度,没有频率。它们将被放置在一定数量的带(p)上,因此将有p波段(带状/带状)。
从乐队中读取文本的方式仍然相同,为了阅读乐队中位置k处的文本,我们必须从该乐队的1,2,...,k位读取文本。
现在,我们必须找到一种方法将文本放在p波段上,这样我们就可以获得最小的全局访问时间。这次,通过添加每个频段的所有总访问时间来计算全局访问时间。
此外,总访问时间现在以这种方式计算:
n_
\ [L(T1)+L(T2)+...+L(Ti)]
/_
i=1
我们忽略了频率部分,因为它不再是问题的一部分。