查題演算法
Ⅰ 解決查找問題的演算法流程圖如圖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了