算法(0)-时间复杂度-二分法的详解与扩展-对数器-C++版
常数操作:一个操作如果跟样本数据量无关,每次都是固定时间完成,这叫常数操作。
时间复杂度:一个算法流程中的常数操作的表达式。粗描了一个算法流程。
//1.数据量无关:
int t=3+5;
int p =t>>1;
//2.数组寻址 系统偏移量去拿的
int [] arr =new int[200万]
//3.链表
int p=list.get(100万+1)
1.二分法的详解与扩展
1.在一个有序数组中,找到某个数是否存在
2.在一个有序数组中,找>=某个数最左侧的位置
3.局部最小值问题
2.异或运算
1.异或运算=无进位相加
2.异或运算满足交换律和结合律(a^b=b^a )(a^b)^c=a^(b^c)
3.不用额外变量交换两个数
a=a^b
b=a^b
a=a^b
4.一个数组中出现了奇数次,其他出现了偶数次,怎么找到这个数
5.一个数组中有两个数出现了奇数次,其他出现了偶数次,怎么找到这两个数
int right=eor&(~eor+1) //提取出最右的1
3.对数器:测试是否正确。
void main()
{
int testTime=50000; //1.测试次数
int maxSize=100; //2.数组的规模不大于100
int maxVaule=100; //3.每个值的范围-100 100
bool suceed =true;
for(int i=0;i<testTime;i++)
{
int []arr1=generateRandomArray(maxSize,maxValue); //1.生成随机数组
int []arr2=copyArry(arr1);
selectionSort(arr1); //2.运行 我的程序
comparator(arr2); // 系统程序
if(!isEqual(arr1,arr2)) //3.比对结果
{
succeed=false; //如果不一样,不失败
printArray(arr1);
printArray(arr2);
break;
}
}
//
print(结果是否正确!)
int [] arr=generateRandomArray(maxSize,maxValue);
printArray(arr);
selectionSort(arr);
printArray(arr);
}
生成随机数:所有数等概率的回一个。
//随机数产生,等概率产生
int generatrRandomArray(int maxSize,int maxValue)
{
//Math.random() ->[0,1) double
//Math.random() *A ->[0,A) ->[0,A-1] int
//(int)(Math.random() *A) ->[0,A-1] int
//1.长度随机 值随机
int [] arr= new int[(int)((maxSize+1)*Math.random())];
for(int i=0;i< arr.length;i++)
{
arr[i]=(int)((maxValue+1)*Math.random())-(int)(maxValue*Math.randome())
}
return arr;
}
int copyArray(int [] arr)
{
if(arr==null)
{
return null;
}
int [] res= new int[arr.length];
for(int i=0;i<arr.length;i++)
{
res[i]=arr[i];
}
return res;
}
void comparator(int[] arr)
{
Arrays.sort(arr);
}