C/C++ 基于对勾函数和双曲线实现高效率散列函数,实现真正意义上的减少冲突!!

C/C++ 基于对勾函数和双曲线实现高效率散列函数,实现真正意义上的减少冲突!!

本散列函数基于对勾函数和双曲线函数实现。
对勾函数图像:
对勾函数

双曲线函数图像:
双曲线函数图像

散列函数分析

通过以上两个函数我们可以制造一个散列函数,符合x2/a2 - y2/b2=1,且a,b值相同。
在下面的代码中,我们将会假设a的值为1,b的值为2,且我们要使用散列表,将待操作数43传入其中并获得其索引,可以得到y = sqrt(b2*x2/a2-b2)
然后将y的值作为x传入对勾函数解得索引值为85.这里我们直接遵循C语言中的截断原则,对带有小数点的值直接截断,也就是取其下界。

代码:

#include <iostream>
#include <cmath>
using namespace std;
class Hex_Function
{
	private:
		long a;
		long b;
	public:
		Hex_Function(int value1, int value2) {
			a = value1;
			b = value2;
		}

		long Create_Hyperbola_function(long value)
		{
			return sqrt(((pow(b, 2)*pow(value, 2)) / pow(a, 2)) - pow(b, 2));
		}

		long Get_Ticking_function(long value)
		{
			return (value*a) + (b / value);
		}
};

int main()
{
	Hex_Function* one = new Hex_Function(1,2);
	cout <<"散列值:"<< one->Get_Ticking_function(one->Create_Hyperbola_function(43));
	return 0;
}

设计思想:

  1. 尽量减少a和b的差的绝对值。
  2. 令a的值尽可能小于b的绝对值。
  3. 取上界和取下界操作对函数没有过大的影响。所以为了简单起见我们直接使用取下届操作。
  4. 所有操作都是基于a和b大于0的情况,且a和b应该同号,否则就要考虑到要对散列结果进行取绝对值操作。或者就是按照int最大取值范围进行模运算。
  5. a和b的取值应根据散列表大小动态定义。
  6. 由于取下界操作影响,总存在一个零界点X使得散列值为0,超过该零界点,散列函数失效。

猜你喜欢

转载自blog.csdn.net/qq_27180763/article/details/82950139