设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 紫苏
打印 上一主题 下一主题

[胡扯] 蛋疼数学程序帝!散列算法

 关闭 [复制链接]

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

1
发表于 2010-8-27 11:58:21 | 显示全部楼层
本帖最后由 DeathKing 于 2010-8-27 12:07 编辑

看得不是很明白,说的不知道是不是这个意思:

1、映射GET_HASH:P->Z是一个1对1的函数
2、对于e∈P,GET_HASH(e)是e的唯一标识符?(也就是唯一的全局识别id?)

也就是Point.new(1,0)就像1、2那样,是个固定数,也不像Float那样,每次生成的虽然值一样,但是对象却不一样?

点评

补充:对象仍然是不同的,但是交给散列表处理时散列表会认为是相同的元素(即散列集合里的相同元素)  发表于 2010-8-27 13:09
1、基本上可以理解为双射;2、是的,但此处要指定论域为 P;最后一个问题:是的,Point.new(1, 0).eql?(Point.new(1,0)) 应该返回 true  发表于 2010-8-27 13:08

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

2
发表于 2010-8-27 12:06:41 | 显示全部楼层
本帖最后由 DeathKing 于 2010-8-27 13:17 编辑
  1. class Point
  2.   def hash
  3.     return "#{@x}.#{@y.to_s.resive}".to_f
  4.   end
  5. end
复制代码
hash只能接受Integer(Fixnum)么{:nm_3:}
正在考虑返回Fixnum的方法。




好吧,仔细看看这道题并不难,我认为应该这样理解。

1、p ∈ Point; x,y∈Fixnum; h∈Hash(Fixnum)
2、求映射函数GET_HASH:p -> h,且是一个1对1的函数

也就是让我们构建一个二元函数,GET_HASH(x,y),返回一个Fixnum,那么就要找到一个类似与MD5一样的算法就行了。

其他思路整理中。

点评

2^15^2 = 2^30,所以说是为了方便测试,因为在 Fixnum 范围内 o.o  发表于 2010-8-27 13:33
0_0  发表于 2010-8-27 12:23
不但有负数的问题,而且如果不翻转字符串的话,y值的1000和1都一样 0_0  发表于 2010-8-27 12:20
死君殿啊,有负数呢= =话说愚者第一个也想到这个了  发表于 2010-8-27 12:18

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

3
发表于 2010-8-27 13:41:03 | 显示全部楼层
本帖最后由 DeathKing 于 2010-8-27 13:44 编辑

于是,考虑到了一种新的Hash生成方法,这个生成的Hash除了特殊值(Point0,0)以外是【对齐】的。特殊的,Point.new(0,0)返回0。并且在这个函数中,0被认为是正数。去掉了关于x和y长度的字段,因为之前算错了。{:nm_3:}

这个Hash有下面的结构
____________
ABJKLMNOPQRS

A => x的正负,可选值(1、2),特殊的,0视为正数
B => y的正负,可选值(1、2),特殊的,0视为正数
J、K、L、M、N、O、P 、Q、R、S=> 描述符,可选值(0、1、2、3、4、5、6、7、8、9)

算法:
1、求取A、B
2、求取abs_x、abs_y,并转化为字符串
3、填充abs_x、abs_y,直到取得字符串长度为5
4、使用嵌入表达式组合,并使用to_i方法转换

代码:
  1. def hash
  2.   return 0 if @x == 0 and @y == 0
  3.   str = ""
  4.   abs_x = @x.abs.to_s
  5.   abs_y = @y.abs.to_s
  6.   str << (@x >= 0 ? "1" : "2" )
  7.   str << (@y >= 0 ? "1" : "2" )
  8.   while abs_x.size < 5
  9.     abs_x = "0" + abs_x
  10.   end
  11.   while abs_y.size < 5
  12.     abs_y = "0" + abs_y
  13.   end
  14.   return "#{str}#{abs_x}#{abs_y}".to_i
  15. end
复制代码
毛hash个数: 2 * 2 * 2 * 2 * 10 ^ 8 = 1600000000
理论值应该和 2 ^ ( 15 * 2 ) 一样

点评

不错的思路,在顶楼假设的前提下足够了,只是生成的总是 Bignum,未免美中不足呢 可以继续思考能泛用于没有量值限制的 x、y 的散列函数  发表于 2010-8-27 15:17

评分

参与人数 1星屑 +240 收起 理由
紫苏 + 240

查看全部评分


See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

4
发表于 2010-8-29 08:38:02 | 显示全部楼层
回复 六祈 的帖子


    也就是让我们去找一个线性的函数,函数值与元的长度成正比。我一直受MD5的影响,老是想让值对齐 O_O

点评

单纯的数字变换是不可能的。因为可能的值覆盖上面所有的整数域。  发表于 2010-8-29 08:52
没学过MD5的人毫无压力~~~  发表于 2010-8-29 08:41
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

5
发表于 2010-8-29 09:10:23 | 显示全部楼层
  1. irb(main):001:0> {1=>2}.hash
  2. => 13
  3. irb(main):002:0> {1=>3}.hash
  4. => 9
  5. irb(main):003:0> {19999999999999999999999999999999999999=>-11111111111111111111
  6. 111111111111111111111111111111111111}.hash
  7. => 944961355
  8. irb(main):004:0>
复制代码
so:
  1. def hash
  2. return {@a => @b}.hash
  3. end
复制代码
这和八云的借用md5是一个道理吧?

点评

哎呀,试了一下 1.9,Hash 对象的散列码不再是 __id__ TvT 从软件工程角度来讲,自然能二次开发就二次开发,但我们是邪恶的计算机科学家(黑化)  发表于 2010-8-29 09:24
obj = {0 => 0}; p obj.id, obj.hash,哦呵呵呵  发表于 2010-8-29 09:15

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

6
发表于 2010-8-29 09:33:57 | 显示全部楼层
回复 小幽的马甲 的帖子


    其实我之前也是用了几位数来记录长度,但是后来老板说了,如果在题目给定的域下,当然可以这样做。

但是当给定x、y∈R以后,记录长度马上就灰了。

点评

可以不用考虑 R,仅仅是 Z o.o 因为如果是浮点数,自然可以通过内存地址获取到它的散列码,也就相当于整数域了  发表于 2010-8-29 09:43
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-19 08:17

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表