實驗七 自組織線性表查找——數據結構

實驗7查找

【背景】
自組織線性表根據估算的訪問頻率排列記錄,先放置請求頻率最高的記錄,接下來是請求頻率次高的記錄,依此類推。自組織線性表根據實際的記錄訪問模式在線性表中修改記錄順序。自組織線性表使用啓發式規則決定如何重新排列線性表。轉置方法的基本原理是,在一次查找過程中,一旦找到一個記錄,則將它與前一個位置的記錄交換位置。這樣,隨着時間的推移,經常訪問的記錄將移動到線性表的前端,而曾經頻繁使用但以後不再訪問的記錄將逐漸退至線性表的後面。

儘管一般情況下自組織線性表的效率可能沒有查找數和已排序的線性表那麼好,但它也有自身的優勢。它可以不必對線性表進行排序,新記錄的插入代價很小;同時也比查找樹更容易實現,且無需額外的存儲空間。

【實驗目的】
學習課程查找中的“自組織線性表”。實現一個自組織線性表。

【基本要求】
從文件中讀入一組漢字集合,用自組織線性表保存。自組織線性表在查詢時,採用轉置法調整自組織線性表的內容。

從文件中依次讀入需查詢的漢字,把查詢結果保存在文件中(如找到,返回比較的次數,如果沒有找到,返回比較的次數)

【代碼實現】
List.h

class List
{
	public:
		void Inverse(char a[][2],int i,int j);
		int search(char a[][2],int size,char c[2]);
};

List.cpp

void List::Inverse(char a[][2],int i,int j)
{
	 char temp=a[i][0];
	 a[i][0]=a[j][0];
	 a[j][0]=temp;
	 temp=a[i][1];
	 a[i][1]=a[j][1];
	 a[j][1]=temp;
}

main.cpp

#include <iostream>
#include <fstream>
using namespace std;
#include "List.h"
bool flag;
int List::search(char a[][2],int size,char c[2])
{
	List L;
	flag=0;
	int i;
    for(i=0;i<size;i++)
    {
    	if(a[i][0]==c[0]&&a[i][1]==c[1]) 
		{
			  flag=1;
			  break;
		}
	}
	if(flag) 
	{
		if(i>0) L.Inverse(a,i,i-1);
	 	return i+1;
	}
    else return size;
}
int main(int argc, char** argv) 
{
	int i,j,size1,size2,num;
	List L;
	static char a[100][2],b[100][2],c[2];
	ifstream infile1("zizuzhi.txt",ios::in);
	if(!infile1)
	{
		cerr<<"open error!"<<endl;
		exit(1);
	}
	cout<<"讀入的一組漢字爲:"<<endl;
	infile1>>a[0];
	for(i=0;;i++)
	{
		if(a[i][0]==0) break;
	} 
	cout<<a[0]<<' '<<endl;
	size1=i;
	ifstream infile2("chazhaobiao.txt",ios::in);
	if(!infile2)
	{
		cerr<<"open error!"<<endl;
		exit(1);
	}
	cout<<"要查找的漢字爲:"<<endl;
	infile2>>b[0];
	for(j=0;;j++)
	{
		if(b[j][0]==0) break;
	}
	cout<<b[0]<<' '<<endl;
	size2=j;
	infile1.close();
	infile2.close();
	cout<<"査找結果:"<<endl;
	ofstream outfile;
	outfile.open("查找結果.txt",ios::out);
	for(i=0;i<size2;i++)
	{
		num=L.search(a,size1,b[i]);
		c[0]=b[i][0];
		c[1]=b[i][1];
		if(flag)
		{
			cout<<"查找---"<<c<<"---成功!查找次數爲: "<<num<<endl;
			outfile<<"查找---"<<c<<"---成功!查找次數爲: "<<num<<endl;
		}
		else
		{
			cout<<"查找---"<<c<<"---失敗!查找次數爲: "<<num<<endl;
			outfile<<"查找---"<<c<<"---失敗!查找次數爲: "<<num<<endl;
		}
	}
	outfile.close();
	return 0;
}

【測試樣例】
【輸入文本】
zizuzhi.txt
落花人獨立,微雨燕雙飛

chazhaobiao.txt
花雨雙飛燕鎮山河

【輸出文本】
查找結果.txt
查找—花---成功!查找次數爲: 2
查找—雨---成功!查找次數爲: 8
查找—雙---成功!查找次數爲: 10
查找—飛---成功!查找次數爲: 11
查找—燕---成功!查找次數爲: 11
查找—鎮---失敗!查找次數爲: 11
查找—山---失敗!查找次數爲: 11
查找—河---失敗!查找次數爲: 11

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章