Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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++ 在单个过程中以O(n)的时间从大量url列表中查找唯一的url_C++_Python_Algorithm - Fatal编程技术网

C++ 在单个过程中以O(n)的时间从大量url列表中查找唯一的url

C++ 在单个过程中以O(n)的时间从大量url列表中查找唯一的url,c++,python,algorithm,C++,Python,Algorithm,最近我在一次采访中被问到这个问题。我在O(n)时间内给出了一个答案,但只过了两次。他还问我,如果url列表无法放入内存,该如何做。非常感谢您的帮助。对于“内存中的拟合”情况,您可以使用以下两个哈希表(伪代码): 哈希表uniqueTable=; 哈希表ununiquetable=; 对于url列表中的每个url{ if(不可查询的.contains(url)){ 持续 } else if(uniqueTable.contains(url)){ 不可查询。添加(url); 唯一。删除(url);

最近我在一次采访中被问到这个问题。我在O(n)时间内给出了一个答案,但只过了两次。他还问我,如果url列表无法放入内存,该如何做。非常感谢您的帮助。

对于“内存中的拟合”情况,您可以使用以下两个哈希表(伪代码):

哈希表uniqueTable=;
哈希表ununiquetable=;
对于url列表中的每个url{
if(不可查询的.contains(url)){
持续
}
else if(uniqueTable.contains(url)){
不可查询。添加(url);
唯一。删除(url);
}
否则{
uniqueTable.add(url)
}
}
if(uniqueTable.size()>1)
返回uniqueTable.first();

如果它都适合内存,那么问题很简单:创建两个集合(选择您最喜欢的数据结构),两个集合最初都是空的。一个将包含唯一的URL,另一个将包含多次出现的URL。扫描URL列表一次。对于每个URL,如果它存在于唯一集合中,则将其从唯一集合中移除并放入多个集合中;否则,如果它不存在于多个集合中,请将其添加到唯一集合中


如果集合不适合内存,则问题很难解决。O(n)的要求并不难满足,但“单次通过”(似乎排除了随机访问等)的要求很难满足;我认为如果没有对数据的限制,这是不可能的。您可以在集合上使用具有大小限制的集合方法,但这很容易被不幸的数据排序所击败,并且在任何情况下都只有一定的概率(基于Python的

您有一个
列表
-不确定它“来自”哪里,但如果您的内存中已经有它,则:

L.sort()
from itertools import groupby
for key, vals in groupby(L, lambda L: L):
    if len(vals) == 1:
       print key
否则使用存储(可能使用):


将您的数据输入其中,然后执行“按键从任意组中选择*,其中count(*)=1)”

这实际上是一个经典的面试问题,他们期望的答案是您首先对URL进行排序,然后进行二进制搜索。
如果它不适合内存,您可以对文件执行相同的操作。

可以尝试使用Trie结构来保存数据。它是经过压缩的,因此占用的内存更少,这是对常见url部分的内存重用

循环看起来像:

add string s to trie;
check that added string is not finished in existing node
    internal node -> compress path
    leaf node -> delete path

你能提供更多细节吗?你应该找到一个特定的url吗?或者列表中可能有重复的唯一url?什么是“唯一url”?列表中只出现一次的给定URL?或者至少有一个URL恰好出现在列表上一次?唯一一个在列表中只出现一次而没有给出该URL的URL?唯一的URL意味着它在列表中只出现一次也很高兴看到您的回答如果完整的URL列表不适合内存,那么对URL进行哈希运算可以为您节省一些空间。如果数据不适合内存,那么@Ted Hopp:我不认为可以一次就完成了,尽管我还不能“证明”这一点。(是的,虽然上面的解决方案不存储所有URL,只存储每个多个URL的一个实例,但我怀疑它是否算作第二个问题的一般解决方案。)如果它们不适合内存,持久哈希表将help@FelicePollano-是的,当你的评论出现在我的屏幕上时,这正是我所写的。:)@FelicePollano—但是,我不知道有哪种持久哈希表实现支持O(1)操作。如果没有这一点,它可以用来满足单通要求,但不能满足O(n)要求。我所知道的最好方法是O(n logn)。同意你提出的db解决方案,这是否满足复杂性约束?好的观点,虽然你的方法仍然需要不止一次通过。这是我会与面试官讨论的问题,因为我不完全确定URL的排序是应该考虑的,因为这很可能是静态数据,应该以这种方式存储,但是如果是这样的话,你可以在排序中包含你要查找的url,找到它的位置,然后左右查看列表中是否有另一个类似的url,但是基数排序本身在这里需要多次传递。我想知道它是否满足复杂性要求。在Trie(或Patricia树或任何自定义版本)中插入并不是严格意义上的O(1),是吗?我知道它是O(s),其中s=插入字符串的长度。你认为提出的算法是O(n)吗?我只是使用了一个python字典,使用url作为字典的键,并统计了每个url的出现次数。现在,在第二遍中,我迭代了dict以获得count穆西11小时前,所以我们要么忘记这些小事,要么关注每一个细节。
import sqlite3
db = sqlite3.connect('somefile')
db.execute('create table whatever(key)')
add string s to trie;
check that added string is not finished in existing node
    internal node -> compress path
    leaf node -> delete path