小编Ruo*_*ang的帖子

在int数组中找到第一个副本,java

这是我遇到的一个常见的面试问题,但是我没有按照它要求的方式改进它.

assume we have an int array int[] A, we want to find the first duplicate entry. 
Run Code Online (Sandbox Code Playgroud)
  1. 几乎每个人都可以想到使用HashSet,并在解析时添加它.这将导致O(n)时间和O(n)空间.在此之后,我被要求在没有其他数据结构的情况下解决它.我说最愚蠢的想法是在O(n ^ 2)时间内比较每一个.然后我被要求改善O(n ^ 2)时间.

  2. 为了改进它,我想到使用一个固定大小的数组(假设最大数是n),boolean [] b = new boolean [n]; 但我不允许使用这种方法.

  3. 然后我想到使用一个int变量,使用位操作,如果最大数小于32,那么对于n我们可以向左推1到n位并且| 到检查器,然后检查器到阵列中的下一个条目,检查它是否> 0.例如:

    int c = A[i];
    if(check & (1 << c) > 0) return false;
    check |= 1 << c;
    
    Run Code Online (Sandbox Code Playgroud)

但是这也是不允许的.

所以有一个暗示我可以将数组本身用作hashset/hashtable和"线性散列"?

任何帮助?谢谢

java algorithm

23
推荐指数
1
解决办法
8554
查看次数

N路合并排序2G字符串文件

这是破解编码访谈的另一个问题,我在阅读之后仍有一些疑问.

9.4 If you have a 2 GB file with one string per line, which sorting algorithm 
    would you use to sort the file and why?
Run Code Online (Sandbox Code Playgroud)

当面试官给出2GB的大小限制时,它应该告诉你一些东西 - 在这种情况下,它表明他们不希望你把所有数据都带入内存.那么我们该怎么办?我们只将部分数据带入内存..算法:

我们有多少内存?假设我们有X MB的内存可用.

  1. 将文件分成K个块,其中X*K = 2 GB.将每个块放入内存并使用任何O(n log n)算法照常排序.将行保存回文件.

  2. 现在将下一个块放入内存并进行排序.

  3. 完成后,将它们逐个合并.

上述算法也称为外部排序.第3步称为N路合并使用外部排序的基本原理是数据的大小.由于数据太大而我们无法将其全部存入内存,因此我们需要采用基于磁盘的排序算法.

怀疑:

在步骤3中,进行合并排序,同时比较2个数组,每次比较时我们是否需要2*X空间?限制是X MB.我们应该把块打成(X/2)*2K = 2GB吗?这样每个块将是X/2 MB,并且将有2K块.或者我只是理解合并排序错误?谢谢!

java sorting algorithm

9
推荐指数
2
解决办法
6301
查看次数

标签 统计

algorithm ×2

java ×2

sorting ×1