Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Bucket散列算法insert函数的实现_C# - Fatal编程技术网

C# Bucket散列算法insert函数的实现

C# Bucket散列算法insert函数的实现,c#,C#,在下面的代码中,不是说“如果数组列表不包含该项,那么添加它”吗 如果项目已经存在,那么为什么要再次添加它 编写的代码说,“如果“value”散列的索引处的集合包含“item”,则尝试再次添加它”。您缺少一个“!”(意思是“not”),如下所示: public void Insert(string item) { int hashValue = Hash(value); if (!data[hashValue].Contains(item)) data[hash

在下面的代码中,不是说“如果数组列表不包含该项,那么添加它”吗

如果项目已经存在,那么为什么要再次添加它

编写的代码说,“如果“value”散列的索引处的集合包含“item”,则尝试再次添加它”。您缺少一个
“!”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);    
    }
}