我想知道为什么,当在单个数组中找到两个相等的元素时,它的下限是n log n
。我根本不知道。
答案 0 :(得分:0)
最糟糕的情况是,两个相等的元素总是你正在看的最后两个元素。没有任何顺序,您必须将每个元素与每个元素进行比较。为O(n ^ 2)。
我们不需要这么愚蠢。我们当然可以通过对数组进行排序来添加订单:O(nlog(n))。之后只需通过数组并查找具有相同值O(n)的两个。
那么这很难做到,这使得下限O(nlog(n))。
答案 1 :(得分:0)
请指明您的问题,您使用哪种算法?
<强>一般强>
下界:在最坏的情况下,你当然必须读取数组的每个索引,即n次操作。
解决问题:如果您有受限制的域,则可以使用另一个将由域的元素编制索引的阵列A.在A [i]中,您将在数组中存储i的#occurences。如果您需要找到元素的位置,您可以拥有一系列链接列表。
为什么O(n log n):如果您有一个元素数组,您可以使用的唯一操作是直接比较,则不能使用此技巧。但是你可以使用一些字典,比如带有O(log n)访问权限的数据结构,你可以使用O(n log n)来到达。我希望看到一个优雅的证据。
为什么不O(n):想象一下,你有一个没有相同元素的数组。你能在O(n)中表现出来吗?如果你考虑它,这不能比排序数组更快。在一般情况下排序最多为O(n log n)。
答案 2 :(得分:0)
通过HashMap,您可以在单个数组中找到具有O(n)复杂度的公共元素。请遵循此Java代码。
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
Main repeat = new Main();
int arr[] = {4, 12, 4, 5, 12, 3, 1,0,6,22,7,15,15};
int arr_size = arr.length;
repeat.printRepeating(arr, arr_size);;
}
void printRepeating(int arr[], int size)
{
HashMap<Integer,Integer> map = new HashMap<Integer, Integer>();
ArrayList <Integer> comon=new ArrayList<>();
int i;
System.out.println("Repeated elements are : ");
for (i = 0; i < size; i++)
{
if (map.containsKey(arr[i]))
System.out.println(arr[i]+"");
else
map.put(arr[i],arr[i]);
}
}
}