查题算法
Ⅰ 解决查找问题的算法流程图如图VB
这个是"对分查找"算法,你提问题要把代码分行写,这样人家很难看清楚,应该象如下所示:
'===================================================================
Private Sub Command1_Click()
Dim key As String , i As Integer
Dim j As Integer , found As Boolean
i = 1: j = 200 : found = False
(1)
Do While i <= j And Not found
m = Int((i + j) / 2)
If cno(m) = key
Then found = True
ElseIf (2) Then
i = m + 1
Else
j = m – 1
End If
Loop
If Not found Then
Text2.Text = "找不到"
Else
Text2.Text = cno(m)
End If
End Sub
程序中划线处(1)应填入
程序中划线处(2)应填入
'===================================================================
代码中最后第二行那个“End If”,是我帮你2上去了,另外数组的名称前面是cno,后面是cnum,
我改为cno了。
显然,key没有赋值,所以(1)处应该是通过键盘输入要查找的数值:
Key = Val(InputBox("请输入要找的数值。")
而对分查找,需要数组是有序的,可以升序也可以降序,你没有告诉我题目是如何说的?
如果数组是升序的:
(2)应该是:cno(m) < key
如果数组是降序的:
(2)应该是:cno(m) > key
显然,这只是程序的一部分,因为其它部分必须处理数组的建立,排序等。
这个问题,应该是教科书上的问题,好好学习吧,否则没法工作!
Ⅱ 跪求一幷查集算法应用问题:团伙问题 算法
#include<iostream>
using namespace std;
int a[5005],b[5005][5005];
int father(int n)//查找
{
if(a[n]==-1)
return n;
else
return father(a[n]);
}
int hb(int x,int y)//合并朋友
{
int n,m;
n=father(x);
m=father(y);
if (n<m)
a[m]=n;
else
a[n]=m;
return 0;
}
int main()
{
int n,m;
int i,j,k;
int x,y,c;
cin>>n>>m;
for(i=1;i<=1001;i++)//初始化
a[i]=-1;
for(i=1;i<=m;i++)
{
cin>>x>>y>>c;
if(c)//x和y是敌人
{
b[y][x]=1;
b[x][y]=1;
}
else//x和y是朋友合并
hb(x,y);
}
for(i=1;i<=n;i++)//Floyd算法
for(j=1;j<i;j++)//如果i和j是敌人,j和k是敌人,那么i和k是朋友,合并
if(b[i][j])
for(k=1;k<i;k++)
if(b[j][k])
hb(i,k);
int s=0;
for(i=1;i<=n;i++)
if(a[i]==-1)
s++;
cout<<s<<endl;
return 0;
}
Ⅲ C语言题目:编写查找算法的演示程序
折半查找
#include <stdio.h>
#define N 51
void main(void)
{
int a[N];
int i,n,num;
int top,bottom,mid;
int flag=1; //如果在表列中找到数字,则值为1,否则为0
int loc=-1;//要查找的数在表列中的位置,如果loca=-1表示表列中没有这个数;如果有这个数,则它的值为所在的位置
printf("你想在多少个数中进行折半查找,请输入(1--50):");
scanf("%d",&n);
while(n<1 || n>50)
{
printf("你输入的数不正确,请重新输入。\n");
printf("你想在多少个数中进行折半查找,请输入(1--50):");
scanf("%d",&n);
}
printf("请你输入一个整数 a[1](需保证递增有序):");
scanf("%d",&a[1]);
i=2;
while(i<=n) //输入从小到大的表列
{
printf("请你输入一个整数 a[%d](需保证递增有序):",i);
scanf("%d",&a[i]);
if(a[i] > a[i-1])
i++;
else
printf("你输入的数不满足要求,请重新输入。\n");
}
//输出表列
printf("\n输出表列\n");
for(i=1; i<=n; i++)
{
printf("%6d",a[i]);
}
printf("\n");
printf("请你输入要查找的数:");
scanf("%d",&num);
flag=1; //假设输入的数在表列中
top=n;
bottom=1;
mid=(top+bottom)/2;
while(flag)
{
//printf("top=%d, bottom=%d, mid=%d, a[%d]=%d\n",top,bottom,mid,mid,a[mid]);
if( (num>a[top]) || (num<a[bottom]) ) //输入的数 num>a[top] 或者 num<a[bottom],肯定num不在这个表列中
{
loc=-1;
flag=0;
}
else if(a[mid]==num) //如果num 等于找到的数
{
loc=mid;
printf("找到数 %6d 的位置%2d\n",num,loc);
break;
}
else if(a[mid]>num) //若 a[mid]>num,则num 一定在 a[bottom]和a[mid-1]范围之内
{
top=mid-1;
mid=(top+bottom)/2;
}
else if(a[mid]<num) //若 a[mid]<num,则num 一定在 a[mid+1]和a[top]范围之内
{
bottom=mid+1;
mid=(top+bottom)/2;
}
}
if(loc==-1)
{
printf("%d 这个数在表列中没有找到。\n",num);
}
printf("折半查找结束,按任意键退出:\n");
}
Ⅳ java关键字查询算法
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.File;
public class search
{
//查找方法,参数,文件绝对路径,查找关键字
public static boolean search(String filepath,String key)
{
try
{
File f = new File(filepath);
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
String s = "";
//int i = 1;
while((s = br.readLine()) != null)
{
if(s.indexOf(key) != -1)
{
return true;
}
}
return false;
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
}
public static void main(String args[])
{
System.out.println(search.search("d://t.txt","l2"));
}
}
修改了下,加两个变量,可以指出查找的位置。
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.File;
public class search
{
//查找方法,参数,文件绝对路径,查找关键字
public static String search(String filepath,String key)
{
try
{
File f = new File(filepath);
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
String s = "";
int i = 1;
int m = 0;
while((s = br.readLine()) != null)
{
if((m = s.indexOf(key)) != -1)
{
return "第"+i+"段,第"+m+"处";
}
i++;
}
return null;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
public static void main(String args[])
{
System.out.println(search.search("d://t.txt","asd"));
}
}
这个,查汉字是没有问题的。
另外,你要全文检索的话,indexOf()还有个方法,indexOf(int start,String key),指定开始查找的位置跟关键字,你查到一处后,将这个数值加1,做为继续查找的开始位置就可以了。
Ⅳ 知乎搜索话题是可以自动补全,使用了什么数据结构和算法
首先,要能够读懂代码,总结算法的思想,搞清楚该题算法是完成什么功能,然后是填空也好,写算法结果也好,就不成问题了。要想提高的快,就得多练啊。同时教材中的相关算法也要熟,好多是书中的原算法
1. 在计算机中,算法是指什么?
答案:解题方案的准确而完整的描述。
2. 在下列选项中,哪个不是一个算法一般应该具有的基本特征?
说明:算法的四个基本特征是:可行性、确定性、有穷性和拥有足够的情报。 答案:无穷性。
3. 算法一般都可以用哪几种控制结构组合而成? 答案:顺序、选择、循环。 4. 算法的时间复杂度是指?
答案:算法执行过程中所需要的基本运算次数。 5. 算法的空间复杂度是指?
答案:执行过程中所需要的存储空间。 6. 算法分析的目的是?
答案:分析算法的效率以求改进。 7. 下列叙述正确的是(C)
A.算法的执行效率与数据的存储结构无关
B.算法的空间复杂度是指算法程序中指令(或语句)的条数 C.算法的有穷性是指算法必须能在执行有限个步骤之后终止 D.算法的时间复杂度是指执行算法程序所需要的时间 8. 数据结构作为计算机的一门学科,主要研究什么?
答案:主要研究数据的逻辑结构、对各种数据结构进行的运算,以及数据的存储结构。 9. 数据结构中与所使用的计算机无关的是数据的(C) A.存储结构 B.物理结构
C.逻辑结构 D.物理和存储结构 10. 下列叙述中,错误的是(B)
A.数据的存储结构与数据处理的效率密切相关 B.数据的存储结构与数据处理的效率无关
C.数据的存储结构在计算机中所占的空间不一定是连续的 D.一种数据的逻辑结构可以有多种存储结构 11. 数据的存储结构是指什么?
答案:数据的逻辑结构在计算机中的表示。 12. 数据的逻辑结构是指?
答案:反映数据元素之间逻辑关系的数据结构。
13. 根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为? 答案:线性结构和非线性结构。
14. 下列数据结构具有记忆功能的是(C) A.队列 B.循环队列 C.栈
D.顺序表
15. 下列数据结构中,按先进后出原则组织数据的是(B) A.线性链表 B.栈
C.循环链表 D.顺序表
Ⅵ 写出从12,3,-1,2,6,9,18,5,-3,17中搜索出数据5的一个算法
最笨的方法是将上述数据存储到一个数组中,然后遍历数组,比较每个元素和5的大小关系,找到则返回下标索引,没找到返回数组大小,时间复杂度为O(n)。代码如下:
//在长度为arrLen的数组arr中搜索elem
intseach(intarr[],intarrLen,intelem)
{
inti;
for(i=0;i<arrlen;++i)
{
if(arr[i]==elem)
break;
}
returni;
}
如果想提高搜索效率,可以考虑用二查搜索树来存储数据,时间复杂度为O(logn)。
Ⅶ 对分查找算法的题目要怎么做。比如给你一堆数字 查找某号需要经过访问哪几个号 这类题怎么做
用变号
Ⅷ 一道编程题 求算法思路.
因为n比较小,此题最优的解法是双向搜索
做法如下(n=20):
枚举前十个数的放入集合的放法,共3^10种,以两个集合的元素差为key,两个集合的元素和为value,存入哈希表
枚举后十个数的放入集合的放法,以两个集合的元素差为key,查哈希表,这样能查到对应的前十个数的分配方法,就知道总和了
这是最优解法,复杂度为3^(n/2)
这题还有一种经典的动态规划的解法,叫“双塔问题”,复杂度为w*n,w为所有数的总和
Ⅸ C语言题目: 搜索算法的设计与实现
呵呵什么时候截止?可以尝试完成,
Ⅹ 后7位为数字的如何快速查询---查询算法问题-在线等
文件的话,两种方法,这两种方法都比较耗内存
1 读取文件文件内容存到HASHMAP中,然后用contains判断一下
2 读取内容后直接通过正则匹配,代码参考如下
String string =" ST15025221 ST15025222 S0T1502522 S1T2503040";
String searchStr ="ST15025222";
if(Pattern.compile("ST15025222").matcher(string).find()){
System.out.println("yes");;
}
数据量大的话,建议存到表里来处理好掉,这些应该都已唯一的ID,建个索引来查就OK了