C# Bucket散列算法insert函数的实现
在下面的代码中,不是说“如果数组列表不包含该项,那么添加它”吗 如果项目已经存在,那么为什么要再次添加它 编写的代码说,“如果“value”散列的索引处的集合包含“item”,则尝试再次添加它”。您缺少一个C# Bucket散列算法insert函数的实现,c#,C#,在下面的代码中,不是说“如果数组列表不包含该项,那么添加它”吗 如果项目已经存在,那么为什么要再次添加它 编写的代码说,“如果“value”散列的索引处的集合包含“item”,则尝试再次添加它”。您缺少一个“!”(意思是“not”),如下所示: public void Insert(string item) { int hashValue = Hash(value); if (!data[hashValue].Contains(item)) data[hash
“!”在您的if
条件前面的code>(意思是“not”
),如下所示:
public void Insert(string item)
{
int hashValue = Hash(value);
if (!data[hashValue].Contains(item)) data[hashValue].Add(item);
}
请注意,在代码段中,值
未定义。如果hashValue
大于集合中的项数,则完全有可能获得IndexOutOfRangeException
另外,data
是未定义的,因此data[hashValue]
处的项也可能是null
,在这种情况下,在尝试调用时,您会得到一个NullReferenceException
根据数据
的数据类型,有不同的方法来处理这些问题。例如,如果它是一个列表数组,则如果哈希超出范围,则不能添加任何内容,如果列表为null
,则可以初始化列表:
public void Insert(string item)
{
int hashValue = Hash(value);
if (hashValue < data.Length)
{
if (data[hashValue] == null) data[hashValue] = new List<string>();
if (!data[hashValue].Contains(item)) data[hashValue].Add(item);
}
}
public void插入(字符串项)
{
int hashValue=Hash(值);
if(hashValue
否,代码说明的是,“如果集合包含该项目,请尝试再次添加”
。你应该有一个“!”
(意思是“not”
)在条件前面(就在第一个括号后面)hash\u value=hash(value)代码>不编译。value
定义在哪里?我从MICHEAL McMILLANRead编写的(使用c#的数据结构和算法)中获得了这段代码。听起来像是一本恐怖的书,可能会让你走上一些不好的道路。不,这段代码很好。这就是bucket算法的工作原理。如果该项的散列存在,那么它将获取该散列的列表(bucket),并将另一项添加到该bucket中。但是@rufusl是正确的。事实上,我是那些留下负面评论的评论者之一。几年前我读过这本书,经常听到自己说wtf??在bucket算法中,我们试图处理当哈希函数为2个项生成一个键时可能发生的冲突。因此其中一个项将被删除。在bucket算法中,我们定义了数组列表的数组列表,因此,如果哈希函数为2个或多个项生成一个键,那么所有这些项都可以在不删除任何项的情况下进行分配。因此,这里不是值的问题,而是insert函数让我感到奇怪。我想这不是书中的错误。我想我是那个得不到的人。请参阅bookOk上此部分的说明?仅供参考,没有人再使用ArrayList
(从.Net 1.1开始)。否则,我认为我的答案仍然有效(除了最后一部分,我假设您使用的是更通用的容器)“bucket是存储在哈希表元素中的简单数据结构,可以存储多个项目。在大多数实现中,此数据结构是一个数组,但在我们的实现中,我们将使用arraylist,这将使我们不必担心空间不足,也可以分配更多空间。“最终,这将使我们的实施更加高效。要插入项,我们首先使用哈希函数来确定存储该项的arraylist。然后检查项目是否已经在arraylist中。如果是,我们什么也不做,如果不是,则调用Add方法将该项插入数组列表。”
public void Insert(string item)
{
int hashValue = Hash(value);
if (hashValue < data.Length)
{
if (data[hashValue] == null) data[hashValue] = new List<string>();
if (!data[hashValue].Contains(item)) data[hashValue].Add(item);
}
}