运行时间中的对数

简介: 运行时间中的对数

如果一个算法用常数时间(O(1))将问题的大小消减为某一部分的(通常1/2),那么该算法就是O(logN).另一方面,如果使用常数时间只是把问题减少一个常数,那么该算法就是O(N).


对分查找:


给定一个整数X和整数后者已经预先排序并在内存中,求使得的下标i,如果X不在数据中,则返回i=-1.明显的算法是从左到右扫描数据,其运行花费的线性时间。然而,这个算法没有用到该表已经排序的事实,这就使得算法不是很好。一个好的策略是验证X是否居中的元素。如果是,则答案就找到了。


如果X小于居中元素,那么我们可以应用同样的策略于居中元素左侧已经排序的子序列;同理,如果X大于居中元素,那么我们检查右半部分。


#include <stdio.h>
#include <stdlib.h>
int BinarySearch(const int A[],int X,int N)
{
  int Low,Mid,High;
  Low=0;
  High=N-1;
  while(Low<=High)
  {
  Mid=(Low+High)/2;
  printf("(Low+High)/2;%d,Low %d,High %d\n",Mid,Low,High);
  if(A[Mid]<X)
  {
    Low=Mid+1;
    printf("Low;%d\n",Low);
  }
  else
  {
    if(A[Mid]>X)
    {
    High=Mid-1;
    printf("High;%d\n",High);
    }
    else
    {
    printf("Mid;%d\n",Mid);
    return Mid;  
    }
  }  
  }
  return -1;
}
int main()
{
  int number[]={1,4,10,15,16};
  int data=0;
  printf("start ....\n"); 
  data=BinarySearch(number,4,5);
  printf("下标是:%d\n",data);  
  exit(0);
}


运行

start ....
(Low+High)/2;2,Low 0,High 4
High;1
(Low+High)/2;0,Low 0,High 1
Low;1
(Low+High)/2;1,Low 1,High 1
Mid;1
下标是:1


欧几里德算法


两个整数的最大公因数是同时整除二者的最大整数。

#include <stdio.h>
#include <stdlib.h>
int Gcd(unsigned int M,unsigned int N)
{
  unsigned int Rem;
  while(N>0)
  {
  Rem=M%N;
  M=N;
  N=Rem;  
  }
  return M;
}
int main()
{
  int number[]={1,4,10,15,16};
  int data=0;
  printf("start ....\n"); 
  data=Gcd(4,5);
  printf("Gcd:%d\n",data);  
  exit(0);
}


运算

start ....
Gcd:1



目录
相关文章
|
1天前
|
算法 C++
如何精确计算出一个算法的CPU运行时间?
如何精确计算出一个算法的CPU运行时间?
|
4月前
|
C++
数的三次方根(二分查找的应用)
数的三次方根(二分查找的应用)
|
4月前
|
机器学习/深度学习 资源调度 算法
对数几率回归
对数几率回归
57 0
|
4月前
leetcode-6118:最小差值平方和
leetcode-6118:最小差值平方和
29 0
|
算法
【二分查找】数的范围/数的三次方根
【二分查找】数的范围/数的三次方根
【二分查找】数的范围/数的三次方根
使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–4
使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–4
使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–4
|
机器学习/深度学习 算法 Java
如此简单的时间复杂度计算方法:大O渐进法,你确定不进来康康
如此简单的时间复杂度计算方法:大O渐进法,你确定不进来康康
158 0
如此简单的时间复杂度计算方法:大O渐进法,你确定不进来康康
用c/c++代码求解时分秒针重合次数
用c/c++代码求解时分秒针重合次数