我写了这段代码来显示只属于任何一个数组的元素。我们可以提高效率吗?
public class App {
public static void main(String[] args){
int[] a = {1,2,3,4,5,6,7,8,9};
int[] b = {1,20,3,4,15,13,6,7,8,12};
for(int i = 0; i < a.length; i++){
int temp = a[i];
for(int j = 0; j < b.length; j++){
if(b[j] == temp){
b[j] = -1;
a[i] = -1;
}
}
if(a[i] != -1)
System.out.print(a[i] + " ");
}
for(int i = 0; i < b.length; i++){
if(b[i] != -1)
System.out.print(b[i] + " ");
}
}
}
答案 0 :(得分:1)
您的代码以O(m * n)
时间复杂度运行,其中m
和n
是数组的大小。
如果可以修改数组,有一些方法可以改善这一点:
整体复杂性= O(m * log(m) + n * log (n) + m + n) = O(m * log(m) + n * log(n)) = O(k * log(k))
其中k = max(m, n)
。请注意,此方法中没有使用额外空间,即空间复杂度为O(1)
。
答案 1 :(得分:1)
是。当然。
目前,您有一个public ActionResult Create([Bind(Include = "Id, name")] Init init,
[Bind(Include = "Id")] Form form)
{
if (ModelState.IsValid)
{
db.Init.Add(init);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(init);
}
,其中O(m * n)
是数组m
的大小,a
是数组n
的大小。
将第一个数组中的数据复制到b
(hashset
操作,其中O(n)
的大小为n
。然后,解析第二个数组检查以查看数据是否在a
(hashset
操作)中。
考虑对第二个数组做同样的事情。