Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
String 从文件中读取URL字符串列表,并找到前10个最容易读取的URL';s_String_Algorithm_Url_Data Structures - Fatal编程技术网

String 从文件中读取URL字符串列表,并找到前10个最容易读取的URL';s

String 从文件中读取URL字符串列表,并找到前10个最容易读取的URL';s,string,algorithm,url,data-structures,String,Algorithm,Url,Data Structures,嗯 我在一大堆采访中都遇到了这个问题,我想我需要一些帮助来解决这个问题 你有一吨的URL的发言权作为一个字符串数组或读取一个文件。您现在需要获得前十个最容易阅读的URL,如文件中前十个最频繁的URL 我的做法是: Read them into a String Array, Iterate through each String/URL, At every Iteration, put them into Hashtable, in

我在一大堆采访中都遇到了这个问题,我想我需要一些帮助来解决这个问题

你有一吨的URL的发言权作为一个字符串数组或读取一个文件。您现在需要获得前十个最容易阅读的URL,如文件中前十个最频繁的URL

我的做法是:

         Read them into a String Array, 
         Iterate through each String/URL,
             At every Iteration, put them into Hashtable, incrementing the count.
         Iterate again and find feed the scores into an array
         Sort and find the top 10 scores OR use max-heap to get the top 10.
         Iterate again and remove the URL's with the top 10 scores.

这是一个非常糟糕的答案吗?有人能帮我进一步解决这个问题吗?

运行时还不错,总体来说有点像O(nlogn)


但是,您可以跳过最后两个步骤。相反,遍历哈希表的条目(或URL),在遍历条目的同时,维护一个包含10个条目的数组,以获得前10个分数;这样您就跳过了排序步骤,整个运行时间将为O(n)。

首先,请注意,您不必要地使用了额外的内存。为什么要将所有内容读取到数组中,然后迭代该数组以将所有内容插入哈希表中?除非您有非常充分的理由这样做,否则您应该在阅读时将其放入哈希表中

这就减少了对阵列的需求,并将内存使用率降低了O(n)。其他步骤听起来相当合理。为前10名分数维护一个包含10个条目的数组的想法是一个不错的方法,但它提出了如何有效地实现这一点的问题

此外,使用哈希表可能会引起实现问题,因为您过于依赖内置库中的某些东西。为了便于访谈,可能更好的方法是将所有内容读取到二元搜索树,其中每个节点都有一个包含字符串的结构,以及该字符串的出现次数(以及指向左、右节点的指针)。二进制搜索树使您能够查看在O(log(n))时间内是否存在字符串。阅读所有内容并将其放入树中后,可以使用shell sort对树进行排序。Shell排序是这个练习的一个很好的选择,因为它倾向于快速消除大量的无序。此解决方案在O(nlog(n))时间内运行


如果你的面试官同意使用哈希表,那么实现一个树可能不值得费心,但如果你说“我将使用哈希表”,你可能会自食其果,当然,除非你实现了哈希表。这实际上取决于上下文。

您可以使用最小的内存和基本上不受限制的文件来执行此操作:

Use the OS-supplied sort utility to sort the URLs on disk
Create a priority queue (binary heap, for example)
For each URL in the file
    if the URL is the same as the previous URL
        increase count
    else
        AddToQueue(previous_url, count)
        previous_url = current_url
        count = 1
EndFor
AddToQueue(previous_url, count)
此时,访问量最大的前10个URL将位于优先级队列中

AddToQueue
函数如下所示:

AddToQueue(url, count)
    if (queue.Count < 10)
        add new url with count to queue
    else if (count > top_of_queue.count)
        remove top URL from queue
        add new url with count to queue
AddToQueue(url,计数)
if(queue.Count<10)
将带有计数的新url添加到队列
else if(计数>队列顶部计数)
从队列中删除顶部URL
将带有计数的新url添加到队列

如果您有足够的内存来加载所有的URL,您可以将它们加载到一个数组中并进行排序。但是如果你有足够的内存来存储所有的URL,那么基于字典的方法可能会更快。

相关问题,尽管它是跨网络的-。另一个相关问题-。只有当Unix
sort file.txt | uniq-c | sort-rn | head
提到哈希表和BST以及它们各自的优点时,才没有坏处,特别是在面试中。使用内置库没有什么错。BST通常也内置在库中。如果我们谈论的是自己实现它们,对我来说,实现也有类似的困难(或简单)。事实上,我会说BST可能更难,特别是考虑到BST如果不能自我平衡的话是相当无用的,你基本上需要记住如何做到这一点,因为很少有人能够在面试中从零开始理解它。在这种情况下,它是按字典排序的,因为它用来检查里面是否有字符串。您仍然需要根据字符串最后出现的次数对其进行排序。因此,我假设您不是指“对树进行排序”,而是指“将树复制到数组中并对其进行排序”(或类似操作),因为对树进行排序可能是一个相当大的挑战。或者维护指向每个树节点的指针列表
AddToQueue(url, count)
    if (queue.Count < 10)
        add new url with count to queue
    else if (count > top_of_queue.count)
        remove top URL from queue
        add new url with count to queue