数据结构-Hash法-静态Hash法

  1. 先理解静态Hash法中几个概念:Hash表,桶、槽、关键字、Hash地址。
    Hash表:

    把辞典中的词条二元组存储到表*ht*中,这个表称为Hash表。
    

    桶(bucket) 和 槽(slot):

    Hash表分成*b* 个桶,*ht[0]*,...,*ht[b-1]*,每个桶可分*s*个槽,每个槽可存放一条词条。
    

    Hash地址:

    每个槽的地址或位置,由一个关于该词条关键字k的Hash函数h计算得到,h把关键字k映射到一个桶号。
    对于关键字k, h(k)是一个整数,取值范围是[0,b-1],称*h[k]*是k的Hash地址。
    

Hash表的关键字密度:

    n/T , 其中n是存放在Hash表中的词条数目,T是所有关键字数目。 

Hash表的装填密度:

    n/(s*b)

桶溢出:

    当一条新词条试图放入某桶中时,该桶已满,此时称为桶溢出。

关键字冲突:

    当一条新词条试图放入某桶中时,该桶已不空,此时称为关键字冲突。 当每桶只有一槽时,则溢出发生时冲突也同时发生,反之亦然。

概念间联系:

    Hash法用Hash函数把关键字映射到Hash表的桶中,Hash函数的设计原则是既要便于计算又要尽量避免冲突。
    由于关键字空间的基数远远大于表中桶数,而且桶中槽数又很小,因此无法避免冲突,所以必须要研究处理溢出的方法。

Hash函数:

    把关键字映射到Hash表的桶里。Hash函数输入时关键字,输出是对应的Hash表的桶的桶号。

一致映射Hash函数:

    在关键字空间随机选取的关键字k, h应把k等概率地映射到桶号i, 即h(k) = i的概率是1/b, 使每个关键字映射到任意一个桶号的机会相等。
    满足一致概率分布的Hash函数称为一致映射Hash函数。

概念联系:

    通常利用关键字做算术运算,取其结果表示桶号的方法构造Hash函数。字符串类的关键字无法直接进行算术运算,
    可事先将关键字转换成另一种形式,如整数再做算术运算得到映射结果。下面介绍常用的Hash函数构造方法。

余数法:

    设关键字是非负整数,余数法对关键字求余,其结果是地址桶号。令关键字是k, 除以某数D, 余数作为k的地址桶号,函数如下:
        h(k) = k mod D
    这个函数得出的桶地址范围是[0,D-1], 因而Hash表至少必须有b=D个桶。尽管对于大多数关键字空间来说,
    实践证明:只要D中的最小素因子不小于20,多数辞典的关键字可以相当均匀地映射到所需桶号范围之内。

平方取中法:

    该方法的Hash函数取关键字平方值的中间某几位做桶地址,要求关键是整数。
    因为关键字的平方值与关键字的所有位相关,即使某几位相同,平方后取中间即为,不同关键字将以高概率映射到不同地址。
    在关键字的平方值中取位的数目将确定表的长度,若取r位,则Hash地址范围是0~pow(2, r)-1,因此采用平方取中法的Hash表,其表长应是2的幂。

折叠法:

    把关键字k分解成长度相等的几段(最右面一段可能不相等),再把各段加起来做Hash地址h(k)。
    各段相加的方法有两种,一种是把分解的各段向右对齐相加,这种做法称为平移折叠法;另一种叫边界对齐折叠,
    即把每段首尾对齐折叠起来,也就是把奇数段按位顺序变反后再与后续邻接到偶数段相加。    

    例:以关键字k=12320324111220为例,先把它分为每段3为十进制位,P1=123,P2=203,P3=241,P4=112,P5=20。
    平移折叠法得到:h(k) = 123 + 203 + 241 + 112 + 20 = 699.
    边界对齐折叠法得到:h(k) = 123 + 302 + 241 + 211 + 20 = 897.

数字分析法:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用JedisPool类来获取Redis连接池,然后使用Jedis类来操作Redis。具体代码如下: JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "redis地址", 端口号); Jedis jedis = jedisPool.getResource(); //使用jedis操作redis jedis.set("key", "value"); jedis.close(); jedisPool.close(); ### 回答2: 要使用Java代码静态扫描别的Spring Boot项目中使用的Redis地址,可以通过以下步骤实现: 1. 首先,需要用到Java的反射机制来获取Spring Boot项目中的所有类。 2. 使用反射,筛选出所有使用了Redis的类,可以通过注解、类名、方名等方式进行判断。 3. 对于每个使用了Redis的类,使用反射获取其字段信息,查找与Redis相关的字段。 4. 对于找到的Redis字段,可以获取其注解信息,判断是否包含有关Redis地址的信息。常见的Redis注解有@Value、@ConfigurationProperties等。 5. 提取Redis地址的方可能有多种,可以根据实际情况进行选择。可以通过解析注解中的value值、通过访问字段的get方、通过读取配置文件等方式来获取Redis地址。 6. 将获取到的Redis地址保存下来,如存入集合或输出到日志文件中。 需要注意的是,上述步骤仅是一种实现思路,具体实现可能会因实际情况而有所差异。在实际操作中,还需要考虑多线程、异常处理等情况。 ### 回答3: 要通过Java代码静态扫描别的Spring Boot项目中使用的Redis地址,可以通过以下步骤实现: 1. 使用Java工具,如Java反射或字节码操作库,扫描目标项目中的所有类和方。 2. 在扫描过程中,检查每个类和方的注解信息,特别关注与Redis相关的注解,如Spring Data Redis的`@EnableRedisRepositories`、`@RedisHash`、`@RedisId`等注解。 3. 如果找到了与Redis相关的注解,获取注解中指定的Redis连接地址信息。可以通过注解的属性或方获取连接地址,如`@RedisId`注解中的属性`connection`。 4. 将获取到的Redis连接地址保存到结果集中,可以使用List或Set等数据结构保存。 5. 扫描结束后,输出结果集中的Redis连接地址,可以将其打印到控制台或进行其他操作。 需要注意的是,这种静态扫描方仅能获取项目中使用了特定注解的Redis连接地址。如果项目中使用其他方式连接Redis(如手动配置或使用第三方库),则无通过这种方获取连接地址。 此外,为了能够访问项目中的类和方,需要将目标项目的字节码文件或jar文件添加到扫描代码的类路径中。可以使用工具类,如URLClassLoader,动态加载目标项目的类文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值