快速查找是否有2个或更多相等的数字

时间:2013-06-17 16:20:09

标签: arrays algorithm language-agnostic hashmap binary-search-tree

我有一组N个不同的数字经常变化。每次更改后,两个或更多数字都有可能变得相等,我不希望这样。数字N可以与最大可能整数一样大。知道经常发生变化,我不想在每次更改后将每个数字与其余数字进行比较。

如何快速查找数组中是否至少有2个相等的数字?

2 个答案:

答案 0 :(得分:3)

这实际上取决于你有什么其他限制,例如:

  1. 您是否需要维护号码的输入顺序?
  2. 这些数字是否只是被添加,还是被删除了?
  3. 什么是更常见的操作:添加/删除或检查欺骗?
  4. 你需要保留什么 - 集合(即唯一数字)或多重集合(带有多重性的数字)?
  5. 有两个基本选项:Binary Search TreeHash Table

    前者平均为O(log(n))次操作,后者为O(1);实际结果将取决于你有什么样的流(数字是随机的?增加?遵循一个奇怪的非显而易见的模式?)

    如果您决定购买BST,请记住您必须keep it balanced

    示例(未经测试)

    (defparameter *my-data-array* (make-array 100000))
    ;; fill *my-data-array*
    (defparameter *my-data-table*
      (let ((ht (make-hash-table)))
        (loop for v across *my-data-array*
            do (incf (gethash v *my-data-table* 0)))
        ht))
    (defun modify-data-array (pos new-value)
      (let* ((old-value (aref *my-data-array* pos))
             (old-count (decf (gethash old-value *my-data-table*)))
             (new-count (incf (gethash new-value *my-data-table* 0))))
        (setf (aref *my-data-array* pos) new-value)
        (case old-count
          (0 ; old-value is now not in the array
           ...)
          (1 ; old-value is now unique
           ...)
          (t ; old-value is still not unique
           ...))
         (case new-count
          (1 ; new-value was not in the array before
           ...)
          (2 ; new-value was unique before, but not anymore
           ...)
          (t ; new-value was not unique
           ...))))
    

答案 1 :(得分:0)

作为变体,您可以使用Bloom filter。它允许测试是否已添加给定数字。但可能存在误报误差。另一方面,布隆过滤器具有空间效率和快速性,并允许您保留阵列。如果你重复数字稀少,布隆过滤器算法将对你有用,否则你必须经常在线性时间重新测试数字。