在小于 O(n^2) 的时间内查找一个数字在数组中重复的次数
我写的示例代码。但是这是 n^2
int a[]={1,4,1,5,2,2,4,3,4,1};
int b[][]=new int[5][2];
int i,j,k=0,count=1;
boolean temp=false;
for(i=0;i<a.length;i++)
{
for(j=0;j<5;j++)
{
if(a[i]==b[j][0])
{ temp=true;
b[j][1]++;
break;
}
}
if(temp==false)
{
b[k][0]=a[i];
b[k][1]=1;
k++;
}
temp=false;
}
for(i=0;i<5;i++)
{
for(j=0;j<1;j++)
{
System.out.println(b[i][j]+" is repeated "+b[i][j+1]+" times");
}
}
Sample code that I have written.But this is n^2
int a[]={1,4,1,5,2,2,4,3,4,1};
int b[][]=new int[5][2];
int i,j,k=0,count=1;
boolean temp=false;
for(i=0;i<a.length;i++)
{
for(j=0;j<5;j++)
{
if(a[i]==b[j][0])
{ temp=true;
b[j][1]++;
break;
}
}
if(temp==false)
{
b[k][0]=a[i];
b[k][1]=1;
k++;
}
temp=false;
}
for(i=0;i<5;i++)
{
for(j=0;j<1;j++)
{
System.out.println(b[i][j]+" is repeated "+b[i][j+1]+" times");
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
这是伪代码的解决方案:
现在
histogram[somenumber]
包含该数字在数组中的次数 - 假设Map
在O(n)
中code> 在O(1)
中查找项目Here's a solution in pseudocode:
Now
histogram[somenumber]
contains the number of times the number is in the array - inO(n)
assuming theMap
looks up items inO(1)
选项 1:牺牲内存以换取速度。
HashMap
这样的数据结构来记录每个数字的频率。选项 2:排序
Option 1: sacrifice memory for speed.
HashMap
to record frequencies of each number.Option 2: sort
伪代码:
O(n)
Pseudocode:
O(n)
你应该使用例如。合并排序对数组进行排序,然后使用简单的 for 循环遍历整个数组来计算重复次数。
合并排序有 n*log(n) 和 for 循环来查找重复项也很快。
You should use eg. merge sort to sort your array and then use a simple for-loop to go through the whole array to count the repeats.
Merge sort has n*log(n) and a for-loop to find the repeats is also quick.
快速排序算法应该比 O(n^2) 快得多,并且后面跟着一个组,即 O(n) 应该仍然比 O(n^2) 快。
因此,在伪代码中:
A fast sorting algorithm should be much faster than O(n^2), and that followed by a group, which is O(n) should still be faster than O(n^2).
Therefore, in pseudocode:
您可以通过创建另一个数据结构(例如映射)在 O(n) 时间内实现。
前任:
int a[]={1,4,1,5,2,2,4,3,4,1};
结果:{1=3, 2=2, 3=1, 4=3, 5=1}
You can achive in O(n) time by creating another datastructure like map.
Ex:
int a[]={1,4,1,5,2,2,4,3,4,1};
Result: {1=3, 2=2, 3=1, 4=3, 5=1}
为什么使用二维数组?如果已知您的数字在 1..5 范围内,请使用该数字的索引:
Why do you use a 2-dim array? If your numbers are known to be in range 1..5, use the index for the number:
如果您可以更改现有数组,则可以执行此操作。它的 O(n log(n)) 并且不会创建新对象。 (如果你不能改变原始的,你可以克隆它。)它比维护地图更有效。 ;)
印刷
If you can alter the existing array you can do this. Its O(n log(n)) and doesn't create an new objects. (If you cannot alter the original you can clone it.) Its much more efficient than maintaining a Map. ;)
prints
在这种情况下,将 O(n^2) 减少到 O(n*log n) 很简单:
保持以数字为键以及出现次数的高度平衡树是另一个想法,它将给出 O(n*log n)。如果不使用大多数语言中都可以使用的哈希表之类的数据结构,我看不到 O(n) 解决方案。
Reducing O(n^2) to O(n*log n) is simple in this case:
Keeping a height balanced tree with numbers as keys along with the occurrence count is another idea which will give O(n*log n). I don't see an O(n) solution without using a hash-table like data structure which is readily available in most languages.