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

Project1

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

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

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
5 小时
注册时间
2009-9-8
帖子
25
21
发表于 2010-8-29 02:46:50 | 只看该作者
映射……?

点评

双射  发表于 2010-8-29 02:58
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
5 小时
注册时间
2009-9-8
帖子
25
22
发表于 2010-8-29 03:23:17 | 只看该作者
本帖最后由 琪露诺 于 2010-8-29 03:47 编辑

双射……还是不懂是啥 = =
不玩了不玩了

不过……不明真相呢……
class Point
  attr_accessor:x
  attr_accessor:y
  def direct(x,y)
    @x = x
    @y = y
    return [x,y]
  end  
end
po = Point.new
hash = {}
hash[po.direct(1,1)] = 1
hash[po.direct(1,1)] = 2
hash[po.direct(1,1)] = 3
hash[po.direct(1,1)] = 4

貌似不是这么玩 = =?
OTZ……我没读懂题目 - -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
23
 楼主| 发表于 2010-8-29 04:10:45 | 只看该作者
回复 琪露诺 的帖子

class Point
    def initialize(x, y)
        @x, @y = x, y
    end
end

hash = {}
hash[Point.new(1, 1)] = 1
hash[Point.new(1, 1)] = 2
hash[Point.new(1, 1)] = 3
hash[Point.new(1, 1)] = 4

此时,实现 hash 完成题目要求之前表中有 4 个键值对;实现 hash 完成题目要求之后只有 1 个 Point.new(1, 1) => 4
回复 支持 反对

使用道具 举报

Lv1.梦旅人

旅之愚者

梦石
0
星屑
240
在线时间
812 小时
注册时间
2007-7-28
帖子
2148

贵宾

24
发表于 2010-8-29 08:15:42 | 只看该作者
回复 紫苏 的帖子
紫苏大人的意思是否如此:
对于x和y皆取最大值时,hash使用30位,然而x、y并没有那么大时,则应当节约内存?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

贵宾

25
发表于 2010-8-29 08:38:02 | 只看该作者
回复 六祈 的帖子


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

点评

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
26
 楼主| 发表于 2010-8-29 08:53:11 | 只看该作者
回复 六祈 的帖子

30 位是方便在 Ruby 中测试,因为 Ruby Fixnum 只能容纳 31 位,再大了就自动转换为 Bignum,不被 Ruby 的散列表接受,但抛开语言设计限制不谈,就这个题目而言是存在能泛用于任意大小的 x、y 的解的
题目要求仅仅是完美散列 + 泛用于任意大小 x、y,你说的节约内存应该是最小完美散列的概念,即尽可能分配量值小的、分散度小(比如 1、2、3、……、9 这样的连续整数串就是分散度最小的 9 个散列码)的散列码,我手头的一种解法就是最小完美散列,但题目没有要求必须“最小” ^^

点评

呵呵,和压缩多少有一些共通之处(吧?)  发表于 2010-8-29 09:05
为什么我想起了万恶的Huffman……  发表于 2010-8-29 08:55
回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

贵宾

27
发表于 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的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

万物创造者

梦石
0
星屑
54
在线时间
352 小时
注册时间
2008-2-15
帖子
2432
28
发表于 2010-8-29 09:18:54 | 只看该作者
回复 紫苏 的帖子
举个例子,如果用4位记录长度,不考虑负数,得到的Hash串为
1001011101
最开始的那个1是起始符没有意义不用管它
后面的0010这4位记录a的长度(2),因此后两位就是a的值(11=3)
然后从这儿一直到最后就是b的值(101=5)
最后得到a=3,b=5
加入符号也是一样的,这样应该能保证双向映射
   

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

贵宾

29
发表于 2010-8-29 09:33:57 | 只看该作者
回复 小幽的马甲 的帖子


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

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

点评

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
30
 楼主| 发表于 2010-8-29 09:35:14 | 只看该作者
本帖最后由 紫苏 于 2010-8-29 09:41 编辑

回复 小幽的马甲 的帖子

明白了,的确可行,果然思想无疆 o.o

又有个问题:假设需要更多的个“4位”来记录位数的位数,位数的位数的位数,……,那么如何才能知道应该在何时停止,即已经获取到了真实的 a 的位数呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-3 20:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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