用于比较Java

时间:2016-10-18 01:45:27

标签: java arrays algorithm

我目前正在尝试编写一种算法,可以使用Java在O(N)时间内扫描两个数组是否相等。我们的想法是,无论顺序如何,数组都应该完全相等,以使方法返回true。建议我使用线性扫描,但使用一个循环扫描并比较两个数组。这就是我所拥有的:

   public boolean equals(ArraySet<T> s) {
  T[] sArray = s.getArray();
  boolean isEqual = true;
  if (!(s.size() == size())) {
     return false;
  }
  int i = 0;
  int p = 0;
  while ((i < elements.length) && (p < sArray.length)) {
     if (elements[i].compareTo(sArray[p]) != 0) {
        isEqual = false;
        p++;
        continue;
     }
     i++;
     p = 0;
     isEqual = true;
  }
  return isEqual;

我确信这个算法会正确地返回相等性,但我不确定它会在O(N)时间复杂度中这样做。有什么我可以调整,以确保此方法以适当的效率运作? ArraySet是一个Set实现,包含一个由getArray()返回的数组字段。可以假设此数组和局部数组已经按升序自然顺序排列,但显然不能假定参数数组和局部数组具有相同的元素。

1 个答案:

答案 0 :(得分:0)

首先,你在while循环中所做的事情是不正确的。 场景1:即使我们假设两个数组都已排序,在你的while循环中,你只递增p而不是i。那就是你有两个数组:element = {1,2,3} sArray = {1,2,3};你只是将元素[0]与sArray的其余部分进行比较。

场景2:假设两个数组的长度相等但不是按排序顺序排列。 element = {1,2,3} sArray = {2,1,3};即使在这里你的代码再次只是将元素[0]与sArray的其余部分进行比较。

更好的方法是使用HashSet并将元素数组与hashset进行比较。 这是一个比较数组的简单示例:[我们假设两个数组中没有重复项,否则此解决方案不起作用]

Set<Integer> uniqueList = new HashSet<Integer>();
        int[] elements={1,2,3};
        int[] sArray = {3,2,1};
        boolean isArrayElementsEqual = false;

        for(int i=0;i<sArray.length;i++){
            uniqueList.add(sArray[i]);// add one of the arrays complete elements into a set
        }

        for(int i=0;i<elements.length;i++){
            if(uniqueList.contains(elements[i])){//compare another array elements with the set, if its exists them remove it from set..such that by the end of this if both arrays have equal contents, set should be empty
                uniqueList.remove(elements[i]);

            }
        }

        if(uniqueList.isEmpty()){//if this list is empty it means both arrays have same contents
            isArrayElementsEqual = true;
            return isArrayElementsEqual;
        }

        return isArrayElementsEqual;

P.S:你可以根据你的要求修改它