算法 - 当我们有每个文本的长度和频率时,如何找到n个文本的最小总阅读时间?

时间:2016-11-06 21:23:51

标签: algorithm

这个问题听起来像是这样,我们会收到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;}

现在我尝试了几种策略,比如根据长度,频率,甚至长度*频率以及其他一些想法,按升序/降序对文本进行排序,而不是他们总是找到一个反例,一个元素序列的总访问时间比我的程序给我的要少。

2 个答案:

答案 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

我们忽略了频率部分,因为它不再是问题的一部分。