二四看马是什么生肖?

谌鑫美谌鑫美最佳答案最佳答案

“马”字可拆分为“午”“马”,又与“五”“十”谐音,故“午”和“马”可分别与数字、字母“5”或“10”以及字母“M”或“m”对应。 那么,问题就变成了如何找出能同时与24个字母、24个数字对应的72个字来,这显然是一个数学问题——排列组合嘛! 但是,如果单纯用计算机来完成这件事的话,效率未免也太低了。有没有什么好的算法可以加快这一过程呢?当然有!这就是本节要介绍的主题:哈希排序。

首先我们来看看直接使用hash函数来做事情的过程: 将待处理的数据(即“马”字)作为参数传入 hash函数中,根据函数返回的数组index就可以找到“马”字在字符串中首次出现的位置k,接下来按照这个位置对字符串进行切割,然后遍历切割后的所有子串即可。

但问题是int类型在C语言中本身就是一个大小型数据都支持的整数类型,而hash函数的作用是将任意长的输入压缩到[0,n-1]之间,因此其结果很有可能就是一串无休止的数字流,我们无法直接根据这样的数值去定位所需要查找的元素。 为了便于追踪和检索,我们需要让hash函数的返回值具有更好的人类可读性。一种方法是直接将hash值的索引返回给用户,比如本题可以返回从0开始计数的“马”字在字符串中所处的位置,也就是6。但是这样仍然不能保证元素的唯一性。另一种方法则是引入散列函数,使得每个元素都在函数执行完成后具有唯一确定的输出。

所谓“散列函数”,是指把任意长度的输入通过某种方式变换为固定长度(本题中为10进制正整数)的输出,这种用于转换的函数就叫做散列函数(hash function)。 由于原始的hash函数往往无法避免冲突的问题,因此需要借助其它手段来解决。最典型的方法就是在hash函数之后添加一个长度为0~n-1的随机数,称作散列扰动(hash bumping)或者消息扰动(message digesting)。

经过扰动的hash函数能够保证任何两个元素的散列值都不会相同,从而解决了元素之间的冲突问题。由于每次函数执行的结果都是不同的,所以我们可以直接把散列值当作是函数执行的返回值。 以上面的程序为例,如果把原程序中的hash函数替换为加上了扰动的hash函数,则程序就能够正常地运行下去并获得最终的结果了。

我来回答
请发表正能量的言论,文明评论!