码迷,mamicode.com
首页 > 编程语言 > 详细

编程珠玑第一章习题6.1000个整数排序

时间:2019-12-03 23:27:57      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:复杂度   这一   数值   java   大小   表示   记录   优化   api   

 

 

 

 

 

题目描述: 1~1000万的整数,随机挑出1000个整数(可重复),每个整数最多可以出现10次。将这些整数按照升序排序。  

分析:      1000个整数,我们可以用1000万个字符按大小来记录它出现的次数,如同 3, 1, 5, 6,5  用5个字符数组表示就是 { 1, 0, 1, 0, 2, 1}。1出现1次,所以第一个字符就用1记录;2出现0次,用0记录,以此类推。

              然后,我们按从左往右的顺序,第 i 索引的字符是多少,就输出多少遍该索引(索引即是你要输出的整数)。输出结果是:1,3,5,5,6。是不是很魔性。这种存储完毕即有序的排序,时间复杂度位 O(N),空

              间复杂度就看用什么来存储了。

                既然可以这样的话,我们可以用位图来存储它,可以节约很多空间,而且位操作的速度也很快。可以考虑用每一位记录一个整数,但是位只能是0或1,出现的次数最多能记录一次,要是最多出现10次的话,最少

              要4位(二进制表示 BIN 1111,   十进制 DEC 15)。所以,我们可以用半字节来记录一个整数,那么,1000万个整数,需用(1000万/2)500万个字节。在java中用int型来存储,需要(500万/4)125万个int型就可以了。

              是不是比1000个字符节省了很多的空间(尽管这些空间在现在不算什么)。但是我们还是要有优化精神。

    准备1:既然要用位来记录整数,就必须了解位的相关操作与运算。我们可以用两种方式来实现位的加法。

               首先来科普一下,位的加法运算,以四位为例。

                   (1)位的加法可以用异或位运算来完成:BIN (0001) + BIN (0001)  = BIN (0001)  ^ BIN(0001)  =  BIN (0001),注意此时的结果是不带进位的和。

                   (2)位加法的进位的计算可以用位的与运算来完成:进位 = [ BIN (0001)  & BIN (0001) ] << 1  = BIN (0010)。

                   (3)然后将(1)和(2)再相加得到的结果就是 最终的和:BIN (0001)  +  BIN (0010) =  BIN (0001)  ^ BIN(0010)  +  [ BIN (0001)  & BIN (0001) ] << 1 

                 现在我们来看,最终和又变成了两个二进制相加了,那加到什么时候才停止呢,肯定是加到没有进位了呀,就是进位等于0啊。

                是不是感觉豁然开朗,这不就是一个递归相加操作嘛,直到进位等于0就结束递归。那心里有低了,我们完全可以用递归来实现这一加法操作(真是一波操作猛如虎啊)。

                那我们来实现它一下吧。

               就几行代码,是不是很简单。

    准备2:开始动手编码前,我们首先应该清楚实现位结构存储需要哪些API,就是把某整数按半字节存储到按整型数组里,然后再根据记录的数值循环输出 这一系列操作的基本函数是什么。

                 1.  set函数:把某个整数的出现次数存储到 int中。halfSet( int  val )

                 2.  clear函数: 把某个整数的出现次数清零。此操作可以初始化我们的 int数组,还可以干其他的活(后面讲)。halfClr( int val )

                 3.  getValue函数:把某个整数的出现次数获取出来,以便循环输出。 getValue( int  val )

          下面我们就着手大干一场吧。。

    实现:

              

dfd

 

 

编程珠玑第一章习题6.1000个整数排序

标签:复杂度   这一   数值   java   大小   表示   记录   优化   api   

原文地址:https://www.cnblogs.com/leafIcesun/p/11980112.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!