Algs4-1.1.32直方图

 1.1.32直方图。假设标准输入流中含有一系列的double值。编写一段程序,从命令行接受一个整数N和两个double值l和r。将(l,r)均分为N段并使用StrDraw画出输入流中的值落入每段的数量的直方图。

解决这个问题的思路是:
1.创建一个二维数组,其中第一维用来存储 (r-l)/N等分段的边界值,第二维用来存储标准输入流中的值落在这个段中的个数。

2.将标准输入流进行了非递减有序序列的设。有此假设的主要原因是受资料内容都在描述二分查找以及此问题前的其他问题的解决方法也以二分查找为基础进行的修改。正是有此假设才出现了在有序数组中采用二分查找段查找的方式。关键实现如下:

    public static void rank(double key,double[][] group)
    {
        if (key<group[0][0] || key>=group[group.length-1][0]) return;
        int lo=0;
        int hi=group.length-1;
        while (lo<hi-1)
        {
            int mid=lo+(hi-lo)/2;
            if (key<group[mid][0]) hi=mid;
            else if(key>group[mid][0]) lo=mid;
            else {group[mid][1]++;return;}
          }
       group[lo][1]++;
     }

参考其他人的实现思路是:采用一维数组,然后用标准流中的单个值v,int(v/(r-l))直接计算出值v应落在的数组的索引号,其优点显而易见,算法简单、代码少、支持标准输入流无序、时间复杂度O(1)。而二分段查找对边界值的控制要特别用心,费心还容易出错,时间复杂度为O(lgN)。

原文地址:https://www.cnblogs.com/longjin2018/p/9848712.html