Tag: 哈希表

更快的哈希函数

我正在尝试实现自己的哈希函数,我使用java将每个字符串的ASCII编号相加。 我通过查找哈希表大小和总和来找到哈希码。 大小%之和。 我想知道在搜索字符串时是否有办法使用相同的过程但减少冲突? 提前致谢。

Hashtable和Dictionary之间有什么区别?

Dictionary和Hashtable之间有什么区别,我如何使用Java中的Dictionary类?

根据Java中的值对地图进行排序的最简单方法是什么?

我希望我的哈希值根据值按降序排序。 我如何用Java做到这一点?

如何使用二叉搜索树实现Hashtable?

通过简单地使用以下数据结构,我能够使用数组实现Hashtable。 LinkedList<Item> table[] const int MAX_SIZE = 100 即链表列表(带链接的散列)。 现在在各种书中,他们说如果我们想要有序数据,我们可以用BST实现哈希表。 如何在BST中包含键和值。 虽然我可以像存储单个数据项一样存储这两个数据,但是键给出了一个整数,它就像一个散列函数之后的数组索引。 如何在BST中使用密钥? 我不需要任何索引? 我能想到的是我可以使用该function比较两个键,然后相应地进行正常插入和删除。 EDITS: 假设我从头开始有BST class Node { K key; V value; Node left; Node right; } class BinarySearchTree { Node root; } class Hashtable { BinarySearchTree bst; public void Hashtable() { bst = new BinarySearchTree(); } //hashfunction(K key) //get(K Key) //put(K key,V […]

如何在java hashset中查找和返回对象

根据HashSet javadoc,HashSet.contains只返回一个布尔值。 如何在hashSet中“找到”对象并对其进行修改(它不是原始数据类型)? 我看到HashTable有一个get()方法,但我更喜欢使用该方法。

为什么Hashtable的initialCapacity为11而HashMap中的DEFAULT_INITIAL_CAPACITY为16且需要2的幂

在jdk 1.6中比较HashMap和Hashtable源代码,我在HashMap中看到了下面的代码 /** * The default initial capacity – MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 16; int capacity = 1; while (capacity < initialCapacity) capacity <<= 1; 但是,在Hashtable中,我看到下面的代码? table = new Entry[initialCapacity]; public Hashtable() { this(11, 0.75f); } 所以我的问题是:为什么hashMap需要2的幂作为初始容量? 而哈希表选择11作为默认初始容量? 我认为这与哈希表是线程安全的并且不允许空键或值的事情无关。 谢谢。

哈希表中的下限/上限加载因子

我将在java中编写一个链式哈希集类。 我理解负载因子是M /容量,其中M是表中当前元素的数量,容量是表的大小。 但是,负载因子如何帮助我确定是否应该调整表格并重新调整? 此外,我无法找到任何地方如何计算下/上负载因子。 他们甚至需要吗? 我希望这是足够的信息,谢谢!

如何获取压缩文件(通过索引)并重新创建原始文件? (JAVA)

问题的背景 我一直在开发一些代码,首先关注的是读取字符串并创建文件。 其次,将字符串拆分为数组。 然后获取数组中每个单词的索引,最后删除重复项并将其打印到不同的文件。 我目前已经为此创建了代码,这是一个链接https://pastebin.com/gqWH0x0 (也有一个菜单系统),但它相当长,所以我没有在这个问题中实现它。 压缩方法通过哈希映射完成,获取数组的索引并将它们映射到相关的单词。 这是一个例子: 原文:“海海见海看见” 输出:见[2,4,5],海[0,1,3], 题 下一阶段是将输出恢复到原始状态。 我目前相对较新的java,所以我不知道所需的技术。 代码应该能够获取输出文件(如上所示)并将其放回原始文件中。 我目前的想法是你只需要重写这个hashmap(如下)。 这样想我会不正确? 我以为我应该首先检查堆栈溢出! Map<String, Set> seaMap = new HashMap(); //new hashmap for (int seaInt = 0; seaInt < sealist.length; seaInt++) { if (seaMap.keySet().contains(sealist[seaInt])) { Set index = seaMap.get(sealist[seaInt]); index.add(seaInt); } else { Set index = new HashSet(); index.add(seaInt); seaMap.put(sealist[seaInt], index); } […]

Java – 自定义哈希映射/表格一些点

在之前的一些post中,我提出了一些关于java中自定义哈希映射/表编码的问题。 现在我无法解决它,也许我忘了正确地提到我真正想要的东西,我总结所有这些以使其清晰和准确。 我要做的是: 我正在尝试为我们的服务器编写代码,我必须通过URL查找用户访问类型。 现在,我有1110万个URL(大约)。 那么,我们做了什么, 1)将数据库划分为1.1亿个Url的10个部分。 2)使用并行数组构建HashMap,其键是URL的一部分(表示为LONG),值是URL的其他部分(表示为INT) – 键可以有多个值 。 3)然后在系统启动时,每天在HashMap中搜索一些其他URL(一天内保存的数百万个URL)。 你有什么尝试: 1)我已经尝试了很多NoSQL数据库,但是我们发现它不太适合我们的目的。 2)我为此目的构建了自定义hashmap (使用两个并行数组)。 那么,问题是什么: 当系统启动时,我们必须加载每个数据库的哈希表并执行搜索百万个url: 现在,问题是, 1)虽然HashTable性能非常好,但是加载HashTable时代码需要更多时间(我们使用文件通道和内存映射缓冲区来加载它,加载HashTable需要20秒–220万条入口 – 因为加载因子是0.5, 我们发现它最快 ) 所以,我们花时间:( HashTable Load + HashTable Search)* DB =(5 + 20)* 10 = 250秒。 对我们来说这是非常昂贵的,并且大部分时间(250秒中的200秒)用于加载哈希表。 你有没有想过其他的方式: 一种方法是: 无需担心加载和存储,并通过使用内存映射缓冲区将缓存留给操作系统。 但是,由于我必须搜索数百万个密钥,因此它的性能会比上面提高。 由于我们发现HashTable性能不错但加载时间很长,我们认为可以通过另一种方式将其切断: 1)创建一个大小为Integer_MAX的链接列表数组( 我自己的自定义链表 )。 2)将值(int)插入到编号为密钥编号的链接列表中(我们将密钥大小减小到INT)。 3)因此,我们必须仅将链接列表存储到磁盘。 现在,问题是,创建如此数量的链接列表需要花费大量时间,如果数据分布不均,则创建如此大量的链接列表没有任何意义。 那么,你的要求是什么: 只需我的要求: 1)具有多个值插入和搜索的键。 寻找不错的搜索性能。 2)快速加载(特别)到内存中的方法。 (键是64位INT,值是32位INT,一个键最多可以有2-3个值。我们可以使我们的键32位也会产生更多的冲突,但如果我们可以做得更好,我们可以接受) […]

HashTable是否维护插入顺序?

以下代码以相同的插入顺序给出输出。 我读了javadoc,他们甚至没有谈论插入顺序。 有人可以帮助我获得正确的信息。 import java.util.*; public class hash { public static void main(String[] args) { String str[] = { “japan”, “usa”, “japan”, “russia”, “usa”, “japan”, “japan”, “australia”}; int len = 8; Hashtable ht = new Hashtable(); int i = 0; while (i ” + ht.get(key)); } } }