Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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
Java 关于如何设计与大数据相关的程序的采访任务_Java_Algorithm_Design Patterns - Fatal编程技术网

Java 关于如何设计与大数据相关的程序的采访任务

Java 关于如何设计与大数据相关的程序的采访任务,java,algorithm,design-patterns,Java,Algorithm,Design Patterns,昨天我接受了采访,我有这样一个问题-有服务器和数据库,它们存储大文本信息(每个文本可以>10MB)。对数据库的任何查询都是昂贵的。您需要设计一个程序(服务器),它将接收一个文本并说-这个文本是否在数据库中 我要求作出以下决定— 对每个文本进行一次良好的散列。然后对所有哈希进行设置。如果输入文本的哈希值不在集合中-因此没有此类文本,否则-转到数据库,尝试通过哈希值和相等深度查找此文本。减去这样的决定,它可以是数据库中大量的文本,所以集合会大一点=) 也许你知道如何正确解决这个问题 如评论中所述,基

昨天我接受了采访,我有这样一个问题-有服务器和数据库,它们存储大文本信息(每个文本可以>10MB)。对数据库的任何查询都是昂贵的。您需要设计一个程序(服务器),它将接收一个文本并说-这个文本是否在数据库中

我要求作出以下决定— 对每个文本进行一次良好的散列。然后对所有哈希进行设置。如果输入文本的哈希值不在集合中-因此没有此类文本,否则-转到数据库,尝试通过哈希值和相等深度查找此文本。减去这样的决定,它可以是数据库中大量的文本,所以集合会大一点=)
也许你知道如何正确解决这个问题

如评论中所述,基本概念是通过消除数据库中不可能存在的查询文本来减少对数据库的查询数量

正如您所建议的,散列是一种很好的方法——如果您使用一个好的散列函数(即,低冲突概率),那么您将永远不需要实际比较文本,因为您将()永远不会得到假阳性

散列的一种变体(如果内存成为问题)是使用“一种节省空间的概率数据结构,用于测试元素是否是集合的成员。”这种方法使用的内存比普通散列少得多,但会导致一些误报(即,有时您需要将文本与数据库进行比较,以确保是否匹配)。Bloom筛选器允许您调整内存和误报率之间的权衡。它们用于NoSQL数据库,如和


更新正如David Schwartz正确指出的那样,哈希函数确实很重要,特别是在数据库中存在大量查询的情况下——请参见下面评论中的讨论。同样的问题也适用于Bloom过滤器,当您想将磁盘访问范围缩小到一小部分查询时,它是理想的文件(例如)但这并不是为了完全消除磁盘/数据库访问,因为会出现误报。我最初提到HarrulHash3是作为一个速度基准,但因为它是非加密的,所以不适合这个问题。当我在过去实际实现类似的方法时,我使用了SHA1,它是加密的。

如果使用cryptogr一个安全的散列,比如SHA256,你可以跳过第二步。问题的重点可能是确保你理解一个安全的散列的要点。@DavidSchwartz我不明白如果我使用SHA2,为什么我可以跳过第二步?你能解释一下吗)因为这就是加密安全散列函数的全部要点。两个不同的输入具有相同散列的概率比检查重复的代码由于硬件缺陷而给出误报的概率低几个数量级。我认为这与密码学没有直接关系。在我看来,这是关于最小化对数据库的查询。散列是一个好的开始。然而,你是对的,这在很大程度上取决于散列函数和碰撞概率。@DNA如果我们存储所有散列,这是一个要点。但是什么是变体?当它不是必需的时候?它是可以的,但是如果有很多文本呢?在哪里存储这么多的散列?如果空间出现问题,你可以使用Bloom过滤器-将更新答案。如果要存储在数据库->每次访问数据库都很昂贵,如果要存储在程序中,将需要大量内存。如果我在面试,我会给这个答案一个B+。问题的关键是最小化数据库访问,但是你选择了一个哈希,虽然更快,但需要更多的数据库访问。你把我弄丢了。我提出了一种标准的散列方法,它不需要(可能)DB访问。OP询问了一种使用更少内存的方法,因此我建议使用Bloom过滤器,这种过滤器可以调整以获得可接受的DB访问级别(但仍然比直接检查DB要低得多)。或者你的意思是杂音散列会产生更多的冲突,因为它不是加密的?我怀疑在实际应用中这种差异可以忽略不计;无论如何,我引用Hash3只是为了给出一个可能的速度的具体例子,而不是作为一个建议。