“《编程珠玑》(第2版)第8章”:累积表和排序

  第8章课后的几道题目和解答是这样子的:

  10. 假设我们想要查找的是总和最接近0的子向量,而不是具有最大总和的子向量。你能设计出的最有效的算法是什么?可以应用哪些算法设计技术?如果我们希望查找总和最接近某一给定实数t的子向量,结果又将怎样?

  法一:利用累积表。我们定义cumarr[i]=arr[0]+arr[0]+...+arr[i]。如果有arr[l]=arr[u](l != u),则l..u之间的元素(不包括第l、u元素)总和为0。这个就也能够拓展到查找总和接近某一给定实数t的子向量。

  法二:如果我们不考虑子向量一定要连续这个要求,我们可以先将原向量按升序进行排序,再求cumarr向量。如果cumarr[i]=0,则表示0..i(包括第0、i元素)为所求子向量。这个同样也能够拓展到查找总和接近某一给定实数t的子向量。

  11. 收费公路由n个收费站之间的n-1段公路组成,每一段公路都有相关的使用费。如果在O(n)的时间内驶过两个收费站,并且仅使用一个费用数组;或在固定时间内驶过两个收费站,并且使用一个具有O(n^2)个表项的表,那么给出两站之间的行驶费很容易。请描述一个数据结构,该结构仅需要O(n)的空间,却可以在固定的时间内完成任意路段的费用计算。

  建立一个累积表cumarr。这样任意两站之间的行驶费通过cumarr[i] - cumarr[j]就可以求出了。

  12. 给定整数m、n和实数向量x[n],请找出使总和x[i]+...+x[i+m]最接近0的整数 i (0<=i<n-m)。

  对于此题,同样通过新建一个累积表,再通过累积表项之间的相减就可以求出 i 。

  总结

  从上边几道题可以看出累积表在与数列和相关的方面是一种非常有效的数据结构。当我们要考虑数列和的次序时,我们可以只用单纯的累积表来处理就可以了;当我们要考虑的数列和是没有次序时,结合排序方法很快就能够解决问题。

原文地址:https://www.cnblogs.com/xiehongfeng100/p/4404662.html