对分查找、欧几里得算法、幂运算
来源:互联网 发布:金钥匙软件怎么使用 编辑:程序博客网 时间:2024/06/05 02:08
对分查找
- 算法思想
基本思想:首先该数组必须是已经排序的数组,验证查找的数是否是居中的元素,如果是,则答案就找到了。如果该数小于中间的元素,则用同样的策略在居中元素的左边的序列继续查找;如果该数大于中间的元素,则用同样的策略在居中元素的右侧继续查找。最后如果找到则返回数组中元素的序号,否则查找完没有找到就终止查找。算法步骤:1.首先给搜索范围赋初值,Low=0,High=N-1;2.只要Low<=High,及下界没有超过上届就一直循环;3.循环体首先得到上下界的中间位置,然后判断所查找的数是大于中间元素,就将下界变为中间值+1,去右边空间查找;否则,判断查找的数是否小于中间元素,如果小于中间元素,就将上届赋值为中间值-1,去左边空间查找;否则就代表说查找的数等于中间元素,将中间值返回;4.如果Low>High,表示已经查找完所有的元素,并没有输出结果,表明查找的数不在此数组中,返回-1。- 运行时间
O(log N)- 算法实现
int BinarySearch(int A[], int X, int N){int Low, Mid, High;int NotFound = -1;Low = 0;High = N - 1;while (Low <= High){Mid = (Low + High) / 2;if (A[Mid] < X)Low = Mid + 1;elseif (A[Mid] > X)High = Mid - 1;elsereturn Mid;}return NotFound;}
int BinarySearch(int A[], int X, int N){int Low, Mid, High;int NotFound = -1;Low = 0;High = N - 1;while (Low <= High){Mid = (Low + High) / 2;if (A[Mid] < X)Low = Mid + 1;elseif (A[Mid] > X)High = Mid - 1;elsereturn Mid;}return NotFound;}
欧几里得算法
- 算法思想
基本思想:两个整数的最大公因数(Gcd)是同时整除二者的最大整数。通过连续计算余数直到余数是0为止,最后的非零余数就是最大公因数。通过依次减小余数计算两个数的最大公因数。算法步骤:1.定义一个中间变量存储余数;2.只要余数大于0就表明没有找到最大公因数就,就一直迭代;3.在循环体中首先计算两个数的余数,将被除数赋值给第一个变量,余数赋值给第二个变量;4.当余数等于0的时候,那个被除数(可能是上一个余数)就是最大公因数。- 运行时间
O(log N)- 算法实现
unsigned int Gcd(unsigned int M,unsigned int N){unsigned int Rem = 0;while (N>0){Rem = M%N;M = N;N = Rem;}return M;}
unsigned int Gcd(unsigned int M,unsigned int N){unsigned int Rem = 0;while (N>0){Rem = M%N;M = N;N = Rem;}return M;}
幂运算
- 算法思想
基本思想:
使用递归思想,将整数的幂运算逐步分解,将指数按照奇数还是偶数每次除2,最终递归的基本情况,依次输出。
算法步骤:
1.处理基本情况,指数为0返回1,指数为1返回本身;
2.当指数为偶数时,递归调用函数本身,幂自乘作为新的参数,指数除以2作为新的参数;
3.当指数为奇数时,递归调用函数本身,幂自乘作为新的参数,指数除以2作为新的参数,然后再将结果乘以幂本身。
- 运行时间
O(log N)
- 算法实现
int IsEven(unsigned int N){if (N % 2 == 1)return 0;elsereturn 1;}long int Pow(long int X,unsigned int N){if (N == 0)return 1;if (N == 1)return X;if (IsEven(N))return Pow(X*X, N / 2);elsereturn Pow(X*X, N / 2)*X;}算法改进1:去掉N=1的情况,因为这种情况在N为基数的时候已经包括。
int IsEven(unsigned int N){if (N % 2 == 1)return 0;elsereturn 1;}long int Pow(long int X, unsigned int N){if (N == 0)return 1;if (IsEven(N))return Pow(X*X, N / 2);elsereturn Pow(X*X, N / 2)*X;}算法改进2:将最后一行进行改进,结果和运行时间保持不变。
int IsEven(unsigned int N){if (N % 2 == 1)return 0;elsereturn 1;}long int Pow(long int X, unsigned int N){if (N == 0)return 1;if (IsEven(N))return Pow(X*X, N / 2);elsereturn Pow(X, N-1)*X;}
阅读全文
0 0
- 对分查找、欧几里得算法、幂运算
- 数据结构之对分查找算法
- 【算法】对分查找(排序队列)
- 算法-对分查找(二分查找)C++实现
- java 对分查找
- 对分查找
- 对分查找
- 对分查找
- c_对分查找
- 对分查找
- 对分查找-logN
- 《数据结构与算法分析》笔记------第二章、对分查找
- 对分查找算法(迭代和递归方式)
- 2分查找算法
- c++实现对分查找
- 对分查找(Binary Search)
- 对分查找(二分查找)
- 最近点对问题(欧几里得算法)
- 立贴为证
- Scrapy安装配置,在Pycharm中运行和no module named win32API错误
- C#添加DLL控件到工具箱的方法
- java.nio --Path--Files--基本使用
- python基础
- 对分查找、欧几里得算法、幂运算
- Mybatis拦截器分页
- numpy常用函数总结
- linux系统安装tomcat以及安装jdk
- javascript深入理解js闭包
- SQL学习《SQL必会知识》
- Java并发系列7-Disruptor无锁缓存框架
- 另类的Linq To Sql——CoolEntity开始开发(二) 编写实体类Mapping表
- Win7、win10下利用ETW Trace跟踪用户的文件读写信息