201903
2019年3月9日
1. 牛客网:约束的个数
//用i*i
#include<iostream>
#include<cmath>
using namespace std;
int *yueshu(int n){
//无sqrt(int)
int *a=new int[(int)sqrt((double)n)];
int temp=1;
for(int i=1;i*i<=n;i++){
if(n%i==0){
a[temp++]=i;
if(i*i!=n)
a[temp++]=n/i;
}
}
a[0]=temp-1;//记录数组长度
return a;
}
int main(){
int n;
cin>>n;
int *a=yueshu(n);
for(int i=1;i<=a[0];i++)
cout<<a[i]<<endl;
system("pause");
return 0;
}
2. 查找的概念
-
动态查找表:在查找的同时对表进行修改操作(如插入和删除)
-
静态查找表:不进行修改
-
动态查找表的把表结构本身是在查找过程中动态生成额,即在创建表时,对于给定值,若表中存在其关键字等于给定值的记录,则查找成功返回,否则插入关键字等于给定值的记录。
-
平均查找长度(Average Search Length,ASL):为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值,此为查找成功时的ASL。
3. 顺序查找(Sequential Search)——线性表的查找
- 查找过程:从表的一端开始,依次将记录中的关键字与给定值进行比较,若某个相同,则查找成功,若扫描完整个表后没有相同的,则查找失败
- 既适用于线性表的顺序存储结构,也适用于 链式存储结构。
- 顺序查找
int Search_Seq(int a[10],int n){
for(int i=0;i<10;i++){
if(a[i]==n) return i; //找到,返回其位置
}
return 0; //未找到
}
- 设置监视哨的顺序查找
省去每次都要检查i<10
,查找之前对a[0] (也可以是高处的其他值)进行赋值key,a[0]起到监视哨的作用
int Search_Seq(int a[10],int n){
a[0]=n;
for(i=10;a[i]!=n;--i);//从后向前找
return i;
}
4. 折半查找(Binary Search,二分查找)——线性表查找(效率较高)
- 折半查找效率较高。
- 注意:折半查找要求线性表必须采用
顺序存储结构
,而且表中元素按关键字有序排列
。 - 过程:从表的中间记录开始查找,如果给定值和中间记录相等,则查找成功;如果给定值大于或小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。
//假设a[10]为递增序列
int Search_Bin(int a[10],int n){
int low=0,high=10,mid;
while(low<=high){
mid=(low+high)/2;
if(n==a[mid]) return mid;
else if(n>=a[mid]) low=mid+1;
else high=mid-1;
}
}
- 递归
int Search_Bin(int a[],int n,int low,int high){
if(low>high) return 0; //查找不成功
mid=(low+high)/2;
if(n==a[mid]) return mid;
else if(n<a[mid])
return Search_Bin(a,n,low,mid-1);
else
return Search_Bin(a,n,mid+1,high);
}
- 假设每个元素的查找概率相等,则查找成功使得平均查找长度ASL=1/11*(11+22+43+44)=33/11=3
2019年3月10日
为什么每次我一想学习,就会有各种各样的破事,在家学习效率好低啊
1. 牛客网
求最大最小数:函数的传入参数为数组
成绩排序:还需要使用结构体或线性表来实现一下