C/C++ 基于对勾函数和双曲线实现高效率散列函数,实现真正意义上的减少冲突!!
  TEZNKK3IfmPf 2023年11月12日 31 0

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

对勾函数图像:

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.  
  1. 尽量减少a和b的差的绝对值。
  2. 令a的值尽可能小于b的绝对值。
  3. 取上界和取下界操作对函数没有过大的影响。所以为了简单起见我们直接使用取下届操作。
  4. 所有操作都是基于a和b大于0的情况,且a和b应该同号,否则就要考虑到要对散列结果进行取绝对值操作。或者就是按照int最大取值范围进行模运算。
  5. a和b的取值应根据散列表大小动态定义。
  6. 由于取下界操作影响,总存在一个零界点X使得散列值为0,超过该零界点,散列函数失效。
    1.  
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月17日   25   0   0 编程
  TEZNKK3IfmPf   25天前   38   0   0 C++
  TEZNKK3IfmPf   25天前   26   0   0 指针C++
  TEZNKK3IfmPf   2024年05月31日   24   0   0 算法C++
TEZNKK3IfmPf