游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4820|回复: 6

关于红黑树和Hash表

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2007-9-10 10:46:00 | 显示全部楼层 |阅读模式
我比较喜欢红黑树,插入查找都是固定的复杂度O(lgN)。

我觉得对于固定长度的Hash表的效率很不好,因为我们很难找到一个函数将我们所需要的对象一一对应到一个连续低值的序列中,多数情况下都是有碰撞的。这种不可控性不是我的风格,搞不好你每次都碰到怀运气。

不知道大家怎么看

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2007-9-10 12:13:00 | 显示全部楼层

Re:关于红黑树和Hash表

一个均匀散列的哈希函数求到一个哈希值,把这个值除以你的存储规模求余,得到数字不就放在一个低值的序列范围内了。可能存储规模越大效果越好。

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2007-9-10 14:17:00 | 显示全部楼层

Re:关于红黑树和Hash表

有没有什么比较好的快速的整型的hash函数?

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2007-9-10 15:05:00 | 显示全部楼层

Re:关于红黑树和Hash表

  1. unsigned long hash(const char *name,size_t len)
  2. {
  3.         unsigned long h=(unsigned long)len;
  4.         size_t step = (len>>5)+1;
  5.         for (size_t i=len; i>=step; i-=step)
  6.             h = h ^ ((h<<5)+(h>>2)+(unsigned long)name[i-1]);
  7.         return h;
  8. }
复制代码


LUA里的算法,散列得比较均匀,速度和字符串的长度关系不大(云风wiki里介绍的)

6

主题

60

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2007-9-10 17:18:00 | 显示全部楼层

Re:关于红黑树和Hash表

emplate <class _Init>
        inline size_t _Hash_value(_Init _Begin, _Init _End)
        {        // hash range of elements
        size_t _Val = 2166136261U;
        while(_Begin != _End)
                _Val = 16777619U * _Val ^ (size_t)*_Begin++;
        return (_Val);
        }
vc 2005 sp1的hash算法, 也还可以...

13

主题

113

帖子

113

积分

注册会员

Rank: 2

积分
113
发表于 2007-9-14 18:03:00 | 显示全部楼层

Re:关于红黑树和Hash表

要看用在什么地方吧,较为固定的数据存储,哈希表更好吧。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2007-9-26 16:34:00 | 显示全部楼层

Re:关于红黑树和Hash表

http://blog.csdn.net/tarkey/archive/2004/11/05/167909.aspx
鹅早年做过关于hash table的一些研究。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 05:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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