2018-06-13 机试准备03

Hash值的应用

将存储位置与数据本身对于起来的存储手段


一、例2.5 统计同成绩学生人数

在已知该例可以用Hash的前提下 实现还是很简单的 只怕实际做题时想不到该方法。。

需要注意的是:

初始化总是忘记要比用例数量多+1 如0~100的整数应该是Hash[101] 

并且数组初始化为0是Hash[101]={0} 不是直接=0


二、例2.6 Sort (按从小到大输出前m大的数)

条件:待排序的数字数量为1,000,000; 数据范围为[-500,000,500,000]且各不相同;时间限制1s

分析:即使是快排,复杂度O(nlogn),也会达到千万级,超过1s;

          数据范围有限,考虑Hash,利用一个数组分别统计每一种数字是否出现。

心得:这道题一开始真的没想到怎么用Hash,但是一看到上面这句话就想通了(可怕!

           接下来再从尾到头遍历数组,时间复杂度在1,000,000百万级

代码出现的问题:

1)最开始定义a[1000001]={0}这个数字时,放在了main函数里,导致运行时栈溢出。也就是说大数组应该定义在main函数外。

原因分析:

数组定义在函数中时,占用的内存来自栈空间,栈空间是在进程创建时初始化的,有固定的大小,一般为几十KB,所以太大的数组会耗光栈空间。而全局变量是在编译的时候编到数据段的,可以比较大。

全局变量在静态存储区分配内存,局部变量是在栈上分配内存空间的。(c语言程序在运行时会动态创建一个堆栈段,里面存放着调用栈,保存着函数的调用关系和局部变量。)如果数组太大,可能会造成栈溢出。

所以对于大数组的定义,要么定义为全局变量,要么动态分配内存(malloc()来开辟堆空间,堆空间中的内存是按需分配,自由增长的,可以非常大,32位的系统中可以大到4GB。)

2)该大数组虽然需要在外部定义,但是也需要在内部初始化,以免多组数据中用到已经赋值的数组,影响结果。

3)输出样例中,每个数字间隔了一个空格,但最后一个数字后无空格,所以应该控制好空格的输出

其他可改善的地方:

参考代码中用到了OFFSET, 更有可读性  #define OFFSET 500000

考虑题目中指明了数据“各不相同” 所以另外实现了数据相同时的Hash方法。其中主要的问题是空格的控制比较不熟练。

你可能感兴趣的:(2018-06-13 机试准备03)