Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 改进了在数组中查找最小值和最大值的方法_Algorithm_Sorting_Max_Min - Fatal编程技术网

Algorithm 改进了在数组中查找最小值和最大值的方法

Algorithm 改进了在数组中查找最小值和最大值的方法,algorithm,sorting,max,min,Algorithm,Sorting,Max,Min,我的老师教我Flash排序算法,它的成本约为O(n)。在运行排序之前,我必须找出数组中哪些元素最大,哪些元素最小 这是我的解决方案: //n is a size of array a[] for(int i = 0; i < n ; i++){ if (_max < a[i]) _max = a[i]; if (_min > a[i]) _min = a[i]; } //n是数组a[]的大小 对于(int i=0;i

我的老师教我Flash排序算法,它的成本约为O(n)。在运行排序之前,我必须找出数组中哪些元素最大,哪些元素最小

这是我的解决方案:

//n is a size of array a[]
for(int i = 0; i < n ; i++){
  if (_max < a[i]) _max = a[i];
  if (_min > a[i]) _min = a[i];
}
//n是数组a[]的大小
对于(int i=0;ia[i])_min=a[i];
}
设f(n)是for循环中的若干条件运算符(比较变量i除外)。因此,它的成本是:

  • n将_max与a[i]进行比较的时间
  • n将_min与a[i]进行比较的时间
所以,f(n)=2n

我的朋友写了这样的代码:

for(int i = 0; i < n-1; i+=2)
  if (a[i] < a[i+1]){
    if (_max < a[i+1]) _max = a[i+1];
    if (_min > a[i]) _min = a[i];
  }
  else{
    if (_max < a[i]) _max = a[i];
      if (_min > a[i+1]) _min = a[i+1];
  }
// Compare one more time if n is odd
if (n % 2 == 1){
  if (_min > a[n-1]) _min = a[n-1];
  if (_max < a[n-1]) _max = a[n-1];
}
for(int i=0;ia[i])_min=a[i];
}
否则{
如果(_maxa[i+1])_min=a[i+1];
}
//如果n为奇数,请再比较一次
如果(n%2==1){
如果(_min>a[n-1])_min=a[n-1];
如果(_max
我们可以很容易地得到f’(n)=3n/2+3。当n足够大时,f’(n) 但我的老师要求f(n)=n或f(n)=n+a,其中a是常数


有什么想法吗?

n
很大时,f'(n)=f(n),因为两者都具有O(n)时间复杂度

但是,似乎您需要一次找到最小值和最大值,因此时间复杂度为O(n)的算法是可以的,因为Flash排序也需要O(n),因此总体时间复杂度将由O(n)控制

换言之:

OverallTime = FindMinMax + FlashSort
OverallTime = O(n) + O(n)
OverallTime = 2*O(n)
OverallTime = O(n)
即使FindMinMax更快,Flash排序的第二项仍将主导整个时间复杂性


如果必须加快速度,可以构建一个名为的数据结构,它:

使用O(n logn)存储,可以在O(n logn)时间内构建。段 树支持搜索包含查询的所有间隔 O(对数n+k)中的点,k是检索到的间隔数或 分段


不可能。在精确的n(或n+a)比较中不可能同时找到最大值和最小值。它至少需要3个/2-2个比较。见和。也许你可以把这些证据给你的老师看


关于这个序列还有其他提示吗?就像它是均匀分布的一样?

在第一个if子句中使用else可以稍微加快您的解决方案。但主要学习O-符号,它告诉你忽略常数因子,看@Gerriet你能描述更多吗?我的老师想数一数for循环中有多少个操作,不仅是big-O:害怕我在第一条评论中加入的链接,也许会考虑找一个更好的老师……而且:在这一条中,这两种变体都被更详细地讨论了。嗯。。。我认为跑步时间在这里并不重要。我的老师只想减少for循环min-max中的运算。换句话说,有任何解决方案使用1 for循环,包括1 if else来找出min和max值吗?在本节中,我的老师不关心big-O中的时间复杂性。他要求我们改进for循环,找出数组中的min和max元素。换句话说,我只需要减少f(n),并没有关于序列的提示。这就是我要找到的!非常感谢你!