❶ 如何為配置文件加密
在web.config或app.config文件里我們經常會存儲一些敏感信息,比如connectionStrings或者appSettings,比如像下面的文件。
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<connectionStrings>
<add name="MyNwConnectionString" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername; Password=myPassword;"/>
</connectionStrings>
<appSettings>
<add key="User" value="myUsername"/>
<add key="Password" value="myPassword"/>
</appSettings>
</configuration>
using System;
using System.Configuration;
namespace WebConfigEncryptTest
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string user = ConfigurationManager.AppSettings.Get("User");
string password = ConfigurationManager.AppSettings.Get("Password");
string connectionString = ConfigurationManager.ConnectionStrings["MyNwConnectionString"].ConnectionString;
}
}
}
(一)加密文件可以使用的Provider
.NET為我們提供了一個工具aspnet_regiis.exe來對web.config文件中的敏感信息進行加密(app.config文件可以先改名為web.config,加密後再改回app.config)。你可以使用兩個provider中的一個來進行加密:
System.Configuration.:在System.Configuration.dll中,使用Windows DPAPI(Data Protection API)來進行加密,密鑰存在Windows Local Security Authority(LSA)中。注意:當使用時,加密文件所使用的帳號需要與運行web application的帳號相同,否則web application無法解密加密的內容。
System.Configuration.:在System.Configuration.dll中,使用RSA演算法來進行加密(RSA演算法是非對稱加密,參見《對稱加密與非對稱加密 》),公鑰存放在config文件當中,只有加密的計算機有密鑰。通常是默認的預設provider。
(二)加密文件的命令
加密web.config文件可以使用:
aspnet_regiis -pef section web-app-physical-dir
Encrypt the configuration section. Optional arguments:
[-prov provider] Use this provider to encrypt.
比如運行下面的命令就會分別對connectionStrings和appSettings中的信息進行加密:
aspnet_regiis.exe -pef "connectionStrings" "C:\myweb\HelloService"
aspnet_regiis.exe -pef "appSettings" "C:\myweb\HelloService"
加密後的web.config文件變成:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation targetFramework="4.0" />
</system.web>
<connectionStrings configProtectionProvider="">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>E2fO9C0TJVxImLYQZza+fCQdDbTpNh/kOKLRsK6zcFjkgtUCl6SnMViuu/2G1NVTxqXyEWYwyK6AiCZA+feeG/+f2EIimP7LJI+JRZVerI4MU6Ke3wxm2S/ATc73/W6eg9808f4//JB0kso0kGJ9i+==</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>I1DWG11Iz/rq+NC9C/21B3Q22J9+//JW1oCvAGs5tHrZU5+vgvm0yCmSuCWZbXva+iv9J35EQqs58pq+hwVo1hg1dffpGCBykaXGl5VX3TIGc=</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
<appSettings configProtectionProvider="">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>//SuBvV3D2kxhHaYGFaPuvYgsyOLf3+aYR3O/uh/+/iSANzAWoC+==</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>5W2KhG/oETLUDptobcOM52x1qD/g9A0By/wcGXI+///w=</CipherValue>
</CipherData>
</EncryptedData>
</appSettings>
</configuration>
是默認的預設provider,如果想使用,可以用-prov參數指明:
aspnet_regiis.exe -pef "connectionStrings" "C:\myweb\HelloService" -prov ""
aspnet_regiis.exe -pef "appSettings" "C:\myweb\HelloService" -prov ""
加密配置文件後,源程序不需要做任何改動。如果要修改或添加新的配置信息,需要先解密配置文件。不論使用哪種Provider,都只能在進行加密的計算機上對配置文件進行解密。
❷ 有誰知道二叉樹線索化的完整代碼
復制,保存為.C文件即可。
/* bo6-3.c 二叉樹的二叉線索存儲(存儲結構由c6-3.h定義)的基本操作,包括演算法6.5~6.7 */
void CreateBiThrTree(BiThrTree *T)
{ /* 按先序輸入線索二叉樹中結點的值,構造線索二叉樹T。0(整型)/空格(字元型)表示空結點 */
TElemType ch;
scanf(form,&ch);
if(ch==Nil)
*T=NULL;
else
{
*T=(BiThrTree)malloc(sizeof(BiThrNode)); /* 生成根結點(先序) */
if(!*T)
exit(OVERFLOW);
(*T)->data=ch; /* 給根結點賦植 */
CreateBiThrTree(&(*T)->lchild); /* 遞歸構造左子樹 */
if((*T)->lchild) /* 有左孩子 */
(*T)->LTag=Link; /* 給左標志賦值(指針) */
CreateBiThrTree(&(*T)->rchild); /* 遞歸構造右子樹 */
if((*T)->rchild) /* 有右孩子 */
(*T)->RTag=Link; /* 給右標志賦值(指針) */
}
}
BiThrTree pre; /* 全局變數,始終指向剛剛訪問過的結點 */
void InThreading(BiThrTree p)
{ /* 通過中序遍歷進行中序線索化,線索化之後pre指向最後一個結點。演算法6.7 */
if(p) /* 線索二叉樹不空 */
{
InThreading(p->lchild); /* 遞歸左子樹線索化 */
if(!p->lchild) /* 沒有左孩子 */
{
p->LTag=Thread; /* 左標志為線索(前驅) */
p->lchild=pre; /* 左孩子指針指向前驅 */
}
if(!pre->rchild) /* 前驅沒有右孩子 */
{
pre->RTag=Thread; /* 前驅的右標志為線索(後繼) */
pre->rchild=p; /* 前驅右孩子指針指向其後繼(當前結點p) */
}
pre=p; /* 保持pre指向p的前驅 */
InThreading(p->rchild); /* 遞歸右子樹線索化 */
}
}
void InOrderThreading(BiThrTree *Thrt,BiThrTree T)
{ /* 中序遍歷二叉樹T,並將其中序線索化,Thrt指向頭結點。演算法6.6 */
*Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
if(!*Thrt) /* 生成頭結點不成功 */
exit(OVERFLOW);
(*Thrt)->LTag=Link; /* 建頭結點,左標志為指針 */
(*Thrt)->RTag=Thread; /* 右標志為線索 */
(*Thrt)->rchild=*Thrt; /* 右指針回指 */
if(!T) /* 若二叉樹空,則左指針回指 */
(*Thrt)->lchild=*Thrt;
else
{
(*Thrt)->lchild=T; /* 頭結點的左指針指向根結點 */
pre=*Thrt; /* pre(前驅)的初值指向頭結點 */
InThreading(T); /* 中序遍歷進行中序線索化,pre指向中序遍歷的最後一個結點 */
pre->rchild=*Thrt; /* 最後一個結點的右指針指向頭結點 */
pre->RTag=Thread; /* 最後一個結點的右標志為線索 */
(*Thrt)->rchild=pre; /* 頭結點的右指針指向中序遍歷的最後一個結點 */
}
}
void InOrderTraverse_Thr(BiThrTree T,void(*Visit)(TElemType))
{ /* 中序遍歷線索二叉樹T(頭結點)的非遞歸演算法。演算法6.5 */
BiThrTree p;
p=T->lchild; /* p指向根結點 */
while(p!=T)
{ /* 空樹或遍歷結束時,p==T */
while(p->LTag==Link) /* 由根結點一直找到二叉樹的最左結點 */
p=p->lchild;
Visit(p->data); /* 訪問此結點 */
while(p->RTag==Thread&&p->rchild!=T) /* p->rchild是線索(後繼),且不是遍歷的最後一個結點 */
{
p=p->rchild;
Visit(p->data); /* 訪問後繼結點 */
}
p=p->rchild; /* 若p->rchild不是線索(是右孩子),p指向右孩子,返回循環,*/
} /* 找這棵子樹中序遍歷的第1個結點 */
}
void PreThreading(BiThrTree p)
{ /* PreOrderThreading()調用的遞歸函數 */
if(!pre->rchild) /* p的前驅沒有右孩子 */
{
pre->rchild=p; /* p前驅的後繼指向p */
pre->RTag=Thread; /* pre的右孩子為線索 */
}
if(!p->lchild) /* p沒有左孩子 */
{
p->LTag=Thread; /* p的左孩子為線索 */
p->lchild=pre; /* p的左孩子指向前驅 */
}
pre=p; /* 移動前驅 */
if(p->LTag==Link) /* p有左孩子 */
PreThreading(p->lchild); /* 對p的左孩子遞歸調用preThreading() */
if(p->RTag==Link) /* p有右孩子 */
PreThreading(p->rchild); /* 對p的右孩子遞歸調用preThreading() */
}
void PreOrderThreading(BiThrTree *Thrt,BiThrTree T)
{ /* 先序線索化二叉樹T,頭結點的右指針指向先序遍歷的最後1個結點 */
*Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
if(!*Thrt) /* 生成頭結點 */
exit(OVERFLOW);
(*Thrt)->LTag=Link; /* 頭結點的左指針為孩子 */
(*Thrt)->RTag=Thread; /* 頭結點的右指針為線索 */
(*Thrt)->rchild=*Thrt; /* 頭結點的右指針指向自身 */
if(!T) /* 空樹 */
(*Thrt)->lchild=*Thrt; /* 頭結點的左指針也指向自身 */
else
{ /* 非空樹 */
(*Thrt)->lchild=T; /* 頭結點的左指針指向根結點 */
pre=*Thrt; /* 前驅為頭結點 */
PreThreading(T); /* 從頭結點開始先序遞歸線索化 */
pre->rchild=*Thrt; /* 最後一個結點的後繼指向頭結點 */
pre->RTag=Thread;
(*Thrt)->rchild=pre; /* 頭結點的後繼指向最後一個結點 */
}
}
void PreOrderTraverse_Thr(BiThrTree T,void(*Visit)(TElemType))
{ /* 先序遍歷線索二叉樹T(頭結點)的非遞歸演算法 */
BiThrTree p=T->lchild; /* p指向根結點 */
while(p!=T) /* p沒指向頭結點(遍歷的最後1個結點的後繼指向頭結點) */
{
Visit(p->data); /* 訪問根結點 */
if(p->LTag==Link) /* p有左孩子 */
p=p->lchild; /* p指向左孩子(後繼) */
else /* p無左孩子 */
p=p->rchild; /* p指向右孩子或後繼 */
}
}
void PostThreading(BiThrTree p)
{ /* PostOrderThreading()調用的遞歸函數 */
if(p) /* p不空 */
{
PostThreading(p->lchild); /* 對p的左孩子遞歸調用PostThreading() */
PostThreading(p->rchild); /* 對p的右孩子遞歸調用PostThreading() */
if(!p->lchild) /* p沒有左孩子 */
{
p->LTag=Thread; /* p的左孩子為線索 */
p->lchild=pre; /* p的左孩子指向前驅 */
}
if(!pre->rchild) /* p的前驅沒有右孩子 */
{
pre->RTag=Thread; /* p前驅的右孩子為線索 */
pre->rchild=p; /* p前驅的後繼指向p */
}
pre=p; /* 移動前驅 */
}
}
void PostOrderThreading(BiThrTree *Thrt,BiThrTree T)
{ /* 後序遞歸線索化二叉樹 */
*Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
if(!*Thrt) /* 生成頭結點 */
exit(OVERFLOW);
(*Thrt)->LTag=Link; /* 頭結點的左指針為孩子 */
(*Thrt)->RTag=Thread; /* 頭結點的右指針為線索 */
if(!T) /* 空樹 */
(*Thrt)->lchild=(*Thrt)->rchild=*Thrt; /* 頭結點的左右指針指向自身 */
else
{ /* 非空樹 */
(*Thrt)->lchild=(*Thrt)->rchild=T; /* 頭結點的左右指針指向根結點(最後一個結點) */
pre=*Thrt; /* 前驅為頭結點 */
PostThreading(T); /* 從頭結點開始後序遞歸線索化 */
if(pre->RTag!=Link) /* 最後一個結點沒有右孩子 */
{
pre->rchild=*Thrt; /* 最後一個結點的後繼指向頭結點 */
pre->RTag=Thread;
}
}
}
void DestroyBiTree(BiThrTree *T)
{ /* DestroyBiThrTree調用的遞歸函數,T指向根結點 */
if(*T) /* 非空樹 */
{
if((*T)->LTag==0) /* 有左孩子 */
DestroyBiTree(&(*T)->lchild); /* 銷毀左孩子子樹 */
if((*T)->RTag==0) /* 有右孩子 */
DestroyBiTree(&(*T)->rchild); /* 銷毀右孩子子樹 */
free(*T); /* 釋放根結點 */
T=NULL; /* 空指針賦0 */
}
}
void DestroyBiThrTree(BiThrTree *Thrt)
{ /* 初始條件:線索二叉樹Thrt存在。操作結果:銷毀線索二叉樹Thrt */
if(*Thrt) /* 頭結點存在 */
{
if((*Thrt)->lchild) /* 根結點存在 */
DestroyBiTree(&(*Thrt)->lchild); /* 遞歸銷毀頭結點lchild所指二叉樹 */
free(*Thrt); /* 釋放頭結點 */
*Thrt=NULL; /* 線索二叉樹Thrt指針賦0 */
}
}
❸ 如何對關鍵詞和對應的網頁進行加權搜索
2.1基於詞頻統計——詞位置加權的搜索引擎
利用關鍵詞在文檔中出現的頻率和位置排序是搜索引擎最早期排序的主要思想,其技術發展也最為成熟,是第一階段搜索引擎的主要排序技術,應用非常廣泛,至今仍是許多搜索引擎的核心排序技術。其基本原理是:關鍵詞在文檔中詞頻越高,出現的位置越重要,則被認為和檢索詞的相關性越好。
1)詞頻統計
文檔的詞頻是指查詢關鍵詞在文檔中出現的頻率。查詢關鍵詞詞頻在文檔中出現的頻率越高,其相關度越大。但當關鍵詞為常用詞時,使其對相關性判斷的意義非常小。TF/IDF很好的解決了這個問題。TF/IDF演算法被認為是信息檢索中最重要的發明。TF(Term
Frequency):單文本詞彙頻率,用關鍵詞的次數除以網頁的總字數,其商稱為「關鍵詞的頻率」。IDF(Inverse Document
Frequency):逆文本頻率指數,其原理是,一個關鍵詞在N個網頁中出現過,那麼N越大,此關鍵詞的權重越小,反之亦然。當關鍵詞為常用詞時,其權重極小,從而解決詞頻統計的缺陷。
2)詞位置加權
在搜索引擎中,主要針對網頁進行詞位置加權。所以,頁面版式信息的分析至關重要。通過對檢索關鍵詞在Web頁面中不同位置和版式,給予不同的權值,從而根據權值來確定所搜索結果與檢索關鍵詞相關程度。可以考慮的版式信息有:是否是標題,是否為關鍵詞,是否是正文,字體大小,是否加粗等等。同時,錨文本的信息也是非常重要的,它一般能精確的描述所指向的頁面的內容。
2.2基於鏈接分析排序的第二代搜索引擎
鏈接分析排序的思想起源於文獻引文索引機制,即論文被引用的次數越多或被越權威的論文引用,其論文就越有價值。鏈接分析排序的思路與其相似,網頁被別的網頁引用的次數越多或被越權威的網頁引用,其價值就越大。被別的網頁引用的次數越多,說明該網頁越受歡迎,被越權威的網頁引用,說明該網頁質量越高。鏈接分析排序演算法大體可以分為以下幾類:基於隨機漫遊模型的,比如PageRank和Repution演算法;基於概率模型的,如SALSA、PHITS;基於Hub和Authority相互加強模型的,如HITS及其變種;基於貝葉斯模型的,如貝葉斯演算法及其簡化版本。所有的演算法在實際應用中都結合傳統的內容分析技術進行了優化。本文主要介紹以下幾種經典排序演算法:
1)PageRank演算法
PageRank演算法由斯坦福大學博士研究生Sergey Brin和Lwraence
Page等提出的。PageRank演算法是Google搜索引擎的核心排序演算法,是Google成為全球最成功的搜索引擎的重要因素之一,同時開啟了鏈接分析研究的熱潮。
PageRank演算法的基本思想是:頁面的重要程度用PageRank值來衡量,PageRank值主要體現在兩個方面:引用該頁面的頁面個數和引用該頁面的頁面重要程度。一個頁面P(A)被另一個頁面P(B)引用,可看成P(B)推薦P(A),P(B)將其重要程度(PageRank值)平均的分配P(B)所引用的所有頁面,所以越多頁面引用P(A),則越多的頁面分配PageRank值給P(A),PageRank值也就越高,P(A)越重要。另外,P(B)越重要,它所引用的頁面能分配到的PageRank值就越多,P(A)的PageRank值也就越高,也就越重要。
其計算公式為:
PR(A):頁面A的PageRank值;
d:阻尼系數,由於某些頁面沒有入鏈接或者出鏈接,無法計算PageRank值,為避免這個問題(即LinkSink問題),而提出的。阻尼系數常指定為0.85。
R(Pi):頁面Pi的PageRank值;
C(Pi):頁面鏈出的鏈接數量;
PageRank值的計算初始值相同,為了不忽視被重要網頁鏈接的網頁也是重要的這一重要因素,需要反復迭代運算,據張映海撰文的計算結果,需要進行10次以上的迭代後鏈接評價值趨於穩定,如此經過多次迭代,系統的PR值達到收斂。
PageRank是一個與查詢無關的靜態演算法,因此所有網頁的PageRank值均可以通過離線計算獲得。這樣,減少了用戶檢索時需要的排序時間,極大地降低了查詢響應時間。但是PageRank存在兩個缺陷:首先PageRank演算法嚴重歧視新加入的網頁,因為新的網頁的出鏈接和入鏈接通常都很少,PageRank值非常低。另外PageRank演算法僅僅依靠外部鏈接數量和重要度來進行排名,而忽略了頁面的主題相關性,以至於一些主題不相關的網頁(如廣告頁面)獲得較大的PageRank值,從而影響了搜索結果的准確性。為此,各種主題相關演算法紛紛涌現,其中以以下幾種演算法最為典型。
2)Topic-Sensitive PageRank演算法
由於最初PageRank演算法中是沒有考慮主題相關因素的,斯坦福大學計算機科學系Taher
Haveli-wala提出了一種主題敏感(Topic-Sensitive)的PageRank演算法解決了「主題漂流」問題。該演算法考慮到有些頁面在某些領域被認為是重要的,但並不表示它在其它領域也是重要的。
網頁A鏈接網頁B,可以看作網頁A對網頁B的評分,如果網頁A與網頁B屬於相同主題,則可認為A對B的評分更可靠。因為A與B可形象的看作是同行,同行對同行的了解往往比不是同行的要多,所以同行的評分往往比不是同行的評分可靠。遺憾的是TSPR並沒有利用主題的相關性來提高鏈接得分的准確性。
3)HillTop演算法
HillTop是Google的一個工程師Bharat在2001年獲得的專利。HillTop是一種查詢相關性鏈接分析演算法,克服了的PageRank的查詢無關性的缺點。HillTop演算法認為具有相同主題的相關文檔鏈接對於搜索者會有更大的價值。在Hilltop中僅考慮那些用於引導人們瀏覽資源的專家頁面(Export
Sources)。Hilltop在收到一個查詢請求時,首先根據查詢的主題計算出一列相關性最強的專家頁面,然後根據指向目標頁面的非從屬專家頁面的數量和相關性來對目標頁面進行排序。
HillTop演算法確定網頁與搜索關鍵詞的匹配程度的基本排序過程取代了過分依靠PageRank的值去尋找那些權威頁面的方法,避免了許多想通過增加許多無效鏈接來提高網頁PageRank值的作弊方法。HillTop演算法通過不同等級的評分確保了評價結果對關鍵詞的相關性,通過不同位置的評分確保了主題(行業)的相關性,通過可區分短語數防止了關鍵詞的堆砌。
但是,專家頁面的搜索和確定對演算法起關鍵作用,專家頁面的質量對演算法的准確性起著決定性作用,也就忽略了大多數非專家頁面的影響。專家頁面在互聯網中占的比例非常低(1.79%),無法代表互聯網全部網頁,所以HillTop存在一定的局限性。同時,不同於PageRank演算法,HillTop演算法的運算是在線運行的,對系統的響應時間產生極大的壓力。
4)HITS
HITS(Hyperlink Inced Topic
Search)演算法是Kleinberg在1998年提出的,是基於超鏈接分析排序演算法中另一個最著名的演算法之一。該演算法按照超鏈接的方向,將網頁分成兩種類型的頁面:Authority頁面和Hub頁面。Authority頁面又稱權威頁面,是指與某個查詢關鍵詞和組合最相近的頁面,Hub頁面又稱目錄頁,該頁面的內容主要是大量指向Authority頁面的鏈接,它的主要功能就是把這些Authority頁面聯合在一起。對於Authority頁面P,當指向P的Hub頁面越多,質量越高,P的Authority值就越大;而對於Hub頁面H,當H指向的Authority的頁面越多,Authority頁面質量越高,H的Hub值就越大。對整個Web集合而言,Authority和Hub是相互依賴、相互促進,相互加強的關系。Authority和Hub之間相互優化的關系,即為HITS演算法的基礎。
HITS基本思想是:演算法根據一個網頁的入度(指向此網頁的超鏈接)和出度(從此網頁指向別的網頁)來衡量網頁的重要性。在限定范圍之後根據網頁的出度和入度建立一個矩陣,通過矩陣的迭代運算和定義收斂的閾值不斷對兩個向量Authority和Hub值進行更新直至收斂。
實驗數據表明,HITS的排名准確性要比PageRank高,HITS演算法的設計符合網路用戶評價網路資源質量的普遍標准,因此能夠為用戶更好的利用網路信息檢索工具訪問互聯網資源帶來便利。
但卻存在以下缺陷:首先,HITS演算法只計算主特徵向量,處理不好主題漂移問題;其次,進行窄主題查詢時,可能產生主題泛化問題;第三,HITS演算法可以說一種實驗性質的嘗試。它必須在網路信息檢索系統進行面向內容的檢索操作之後,基於內容檢索的結果頁面及其直接相連的頁面之間的鏈接關系進行計算。盡管有人嘗試通過演算法改進和專門設立鏈接結構計算伺服器(Connectivity
Server)等操作,可以實現一定程度的在線實時計算,但其計算代價仍然是不可接受的。
2.3基於智能化排序的第三代搜索引擎
排序演算法在搜索引擎中具有特別重要的地位,目前許多搜索引擎都在進一步研究新的排序方法,來提升用戶的滿意度。但目前第二代搜索引擎有著兩個不足之處,在此背景下,基於智能化排序的第三代搜索引擎也就應運而生。
1)相關性問題
相關性是指檢索詞和頁面的相關程度。由於語言復雜,僅僅通過鏈接分析及網頁的表面特徵來判斷檢索詞與頁面的相關性是片面的。例如:檢索「稻瘟病」,有網頁是介紹水稻病蟲害信息的,但文中沒有「稻瘟病」這個詞,搜索引擎根本無法檢索到。正是以上原因,造成大量的搜索引擎作弊現象無法解決。解決相關性的的方法應該是增加語意理解,分析檢索關鍵詞與網頁的相關程度,相關性分析越精準,用戶的搜索效果就會越好。同時,相關性低的網頁可以剔除,有效地防止搜索引擎作弊現象。檢索關鍵詞和網頁的相關性是在線運行的,會給系統相應時間很大的壓力,可以採用分布式體系結構可以提高系統規模和性能。
2)搜索結果的單一化問題
在搜索引擎上,任何人搜索同一個詞的結果都是一樣。這並不能滿足用戶的需求。不同的用戶對檢索的結果要求是不一樣的。例如:普通的農民檢索「稻瘟病」,只是想得到稻瘟病的相關信息以及防治方法,但農業專家或科技工作者可能會想得到稻瘟病相關的論文。
解決搜索結果單一的方法是提供個性化服務,實現智能搜索。通過Web數據挖掘,建立用戶模型(如用戶背景、興趣、行為、風格),提供個性化服務。
❹ 小波演算法
Function wavelet(s,wname,n,options);
Begin
{
功能:
一維序列小波消噪。
參數:
s:一維序列
wname:小波函數名
現有小波函數名(小波函數的選取依靠經驗)
Daubechies:
'db1' , 'db2', ... ,'db45' 'db1' 就是haar 小波函數
Coiflets :
'coif1', ... , 'coif5'
Symlets :
'sym2' , ... , 'sym8'
Biorthogonal:
'bior1.1', 'bior1.3' , 'bior1.5'
'bior2.2', 'bior2.4' , 'bior2.6', 'bior2.8'
'bior3.1', 'bior3.3' , 'bior3.5', 'bior3.7'
'bior3.9', 'bior4.4' , 'bior5.5', 'bior6.8'.
Reverse Biorthogonal:
'rbio1.1', 'rbio1.3' , 'rbio1.5'
'rbio2.2', 'rbio2.4' , 'rbio2.6', 'rbio2.8'
'rbio3.1', 'rbio3.3' , 'rbio3.5', 'rbio3.7'
'rbio3.9', 'rbio4.4' , 'rbio5.5', 'rbio6.8'.
n :分解層數
options : 選項
選擇欄位說明
array('brief':1, // 默認為1 採用簡單剔除高頻諧波 達到消噪的目的
// 如果為 0 採用估計序列噪音標准差剔除噪音,
'sigma':0, // 為0 默認採用 序列的高階諧波估計標准差;也可自己輸入值
'which':1, // 以 某一層諧波作為噪音估計的數據,默認第一層
'alpha':2, // 閾值懲罰系數,默認為2
"thr":0, // 閾值大小,默認0 採用諧波估計,也可以直接給出
'sorh':'s', // 閾值方式設置,'s' 軟閾值,'h'硬閾值 默認為's'
);
返回結果:
一維數字數組,消噪後的序列。
範例:
s := array(2484.82690429688,2479.05493164063,2482.34301757813,2437.794921875,
2447.7548828125,2512.962890625,2443.05688476563,2433.15893554688,
2393.18310546875,2415.05395507813,2392.06201171875,2365.34301757813,
2359.21997070313,2344.787109375,2348.51611328125,2420.00,2438.7900390625,
2431.375,2440.40209960938,2383.48510742188,2377.51196289063,2331.36596679688,
2317.27490234375,2370.3330078125,2409.67211914063,2427.47998046875,
2435.61401367188,2473.40991210938,2468.25,2470.01904296875,2504.10791015625,
2508.09008789063,2528.2939453125,2509.79907226563,2503.8359375,2524.9189453125,
2479.53588867188,2481.083984375,2528.71411132813,2529.76098632813,2466.958984375,
2463.0458984375,2416.56201171875,2415.1298828125,2412.625,2395.06494140625,
2397.55395507813,2380.22412109375,2383.03393554688,2412.39306640625,
2333.4140625,2386.86010742188,2360.6640625,2333.22900390625,2325.90502929688,
2332.72998046875,2329.82006835938,2315.27001953125,2291.544921875,2248.59008789063,
2228.52490234375,2180.89501953125,2224.84008789063,2218.23510742188,2215.92993164063,
2191.14794921875,2186.29711914063,2204.78393554688,2190.11010742188,2166.205078125,
2170.01293945313,2173.56103515625,2199.4169921875,2169.38989257813,2148.45190429688,
2163.39501953125,2225.88989257813,2285.74389648438,2276.0458984375,2275.01000976563,
2244.580078125,2206.19311523438,2298.3759765625,2266.38403320313,2296.07495117188,
2319.11791992188,2285.0380859375,2292.61010742188,2268.080078125,2312.55590820313,
2330.40502929688,2331.13598632813,2291.90209960938,2347.53002929688,2349.58911132813,
2351.98095703125,2351.85498046875,2344.77099609375,2366.70190429688,2356.86010742188,
2357.18090820313,2363.59692382813,2381.42993164063,2403.5869140625,2409.55395507813,
2439.6279296875,2447.05688476563,2451.85693359375,2428.48706054688,2426.11499023438,
2460.69311523438);
n := 2;
options := array('brief':1,'sigma':0,'which':1,'alpha':2,"thr":0,'sorh':'s');
return wavelet(s,wname,n,options) ;
天軟數學組
20120627
}
if not ifarray(options) then options := array();
defaut := wavedefaut() union options;
cout := 4;
cl:=wavedec(s,n,wname); //小波分解
if defaut['brief']=1 then
ret :=wrcoef('a',cl[0],cl[1],wname,n);
else
begin
//***************小波消噪*************************************************
k := defaut['which']; //標准差估計選項 ,k 為 1 到 n的整數 默認為1;
if defaut['sigma']=0 then sigma := wnoisest(cl[0],cl[1],k);
else //通過小波第k層細節系數(諧波)估計 ,噪音標准差
sigma := defaut['segma'];
if defaut['alpha']=0 then alpha :=2; // alpha 懲罰因子 大於1 的數 一般為默認2;
else alpha := defaut['alpha'];
if defaut['thr']=0 then
thr := wbmpen(cl[0],cl[1],sigma,alpha); //噪音信號全局閾值
else thr := defaut['thr'];
sorh := defaut['sorh'];
ret:=wdencmp('gbl',cl[0],cl[1],wname,n,thr,sorh)[0]; //採用軟閾值和近似信號進行消噪;
end //第一個參數為'gbl'為擴展介面備用,可以隨意輸入
return ret;
end;
function wavedefaut();
begin
return array('brief':1,'sigma':0,'which':1,'alpha':2,
"thr":0,'sorh':'s'
);
end
❺ 編程實現二叉樹的創建、遍歷(採用非遞歸演算法)、線索化、能夠進行簡單的輸入輸出驗證等。
你可以去成都菲心視覺攝影看看,片子出來的效果也特別的好,
❻ 數據結構與演算法試題,高分,求答案啊
給你第一題解法吧:後面的實在是不想做。
先根:ABCDEFGHI
中根:CBEDAGFHI
遍歷的基本方法:先左子樹後右子樹。
1,先根遍歷可以確定根節點為A,
2,依據1步,可以在中根遍歷中確定左子樹為:CBED,右為:GFHI
3,在可以重復1,2步。就可以得到結果。
A
BF
CDGH
I
4,O(n^3)+O(1)
❼ 怎樣用遞歸演算法實現先序線索二叉樹,並遍歷這個樹啊
基本演算法很簡單的。
void ProSearch(TREE T)//TREE是指針
{
if(T->left)//遍歷左邊
ProSearch(T->left);
print(T);//列印本節點的元素
if(T->right)//遍歷右邊
ProSearch(T->right);
}
❽ 急!Sobel運算元邊緣檢測演算法程序代碼誰有啊,能不能發到我的郵箱[email protected]
close all
clear all
I=imread('tig.jpg'); %讀取圖像
I1=im2double(I); %將彩圖序列變成雙精度
I2=rgb2gray(I1); %將彩色圖變成灰色圖
[thr, sorh, keepapp]=ddencmp('den','wv',I2);
I3=wdencmp('gbl',I2,'sym4',2,thr,sorh,keepapp); %小波除噪
I4=medfilt2(I3,[9 9]); %中值濾波
I5=imresize(I4,0.2,'bicubic'); %圖像大小
BW1=edge(I5,'sobel'); %sobel圖像邊緣提取
BW2=edge(I5,'roberts'); %roberts圖像邊緣提取
BW3=edge(I5,'prewitt'); %prewitt圖像邊緣提取
BW4=edge(I5,'log'); %log圖像邊緣提取
BW5=edge(I5,'canny'); %canny圖像邊緣提取
h=fspecial('gaussian',5); %高斯濾波
BW6=edge(I5,'zerocross',[ ],h); %zerocross圖像邊緣提取
figure;
subplot(1,3,1); %圖劃分為一行三幅圖,第一幅圖
imshow(I2); %繪圖
figure;
subplot(1,3,1);
imshow(BW1);
title('Sobel運算元');
subplot(1,3,2);
imshow(BW2);
title('Roberts運算元');
subplot(1,3,3);
imshow(BW3);
title('Prewitt運算元');
❾ 急於FPGA的串口通信設計
你應該是想實現單片機與FPGA的串口通信。以下內容可能會對你有所幫助:
根據RS232 非同步串列通信來的幀格式,在FPGA發送模塊中採用的每一幀格式為:1位開始位+8位數據位+1位奇校驗位+1位停止位,波特率為2400。本系統設計的是將一個16位的數據封裝成高位幀和低位幀兩個幀進行發送,先發送低位幀,再發送高位幀,在傳輸數據時,加上文件頭和數據長度,文件頭用555555來表示,只有單片機收到555555時,才將下面傳輸的數據長度和數據位進行接收,並進行奇校驗位的檢驗,正確就對收到的數據進行存儲處理功能,數據長度可以根據需要任意改變。由設置的波特率可以算出分頻系數,具體演算法為分頻系數X=CLK/(BOUND*2)。可由此式算出所需的任意波特率。下面是實現上述功能的VHDL源程序。
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity atel2_bin is
port( txclk: in std_logic; --2400Hz的波特率時鍾
reset: in std_logic; --復位信號
din: in std_logic_vector(15 downto 0); --發送的數據
start: in std_logic; --允許傳輸信號
sout: out std_logic --串列輸出埠
);
end atel2_bin;
architecture behav of atel2_bin is
signal thr,len: std_logic_vector(15 downto 0);
signal txcnt_r: std_logic_vector(2 downto 0);
signal sout1: std_logic;
signal cou: integer:=0;
signal oddb:std_logic;
type s is(start1,start2,shift1,shift2,odd1,odd2,stop1,stop2);
signal state:s:=start1;
begin
process(txclk)
begin
if rising_edge(txclk) then
if cou<3 then thr<=0000000001010101; --發送的文件頭
elsif cou=3 then
thr<=0000000000000010; --發送的文件長度
elsif (cou>3 and state=stop2) then thr<=din;--發送的數據
end if;
end if;
end process;
process(reset,txclk)
variable tsr,tsr1,oddb1,oddb2: std_logic_vector(7 downto 0);
begin
if reset=1 then
txcnt_r<=(others=>0);
sout1<=1;
state<=start1;
cou<=0;
elsif txclkevent and txclk=1 then
case state is
when start1=>
if start=1 then
if cou=3 then
len<=thr;
end if;
tsr:=thr(7 downto 0);
oddb1:=thr(7 downto 0);
sout1<=0; --起始位
txcnt_r<=(others=>0);
state<=shift1;
else
state<=start1;
end if;
when shift1=>
oddb<=oddb1(7) xor oddb1(6) xor oddb1(5) xor oddb1(4) xor oddb1(3) xor oddb1(2) xor oddb1(1) xor oddb1(0);
sout1<=tsr(0); --數據位
tsr(6 downto 0):=tsr(7 downto 1);
tsr(7):=0;
txcnt_r<=txcnt_r+1;
if (txcnt_r=7) then
state<=odd1;cou<=cou+1;
end if;
when odd1=> --奇校驗位
if oddb=1 then
sout1<=0;state<=stop1;
else
sout1<=1;state<=stop1;
end if;
when stop1=>
sout1<=1; --停止位
if cou<4 then
state<=start1;
else
state<=start2;
end if;
when start2=>
tsr1:=thr(15 downto 8);
oddb2:=thr(15 downto 8);
sout1<=0; --起始位
txcnt_r<=(others=>0);
state<=shift2;
when shift2=>
oddb<=oddb2(7) xor oddb2(6) xor oddb2(5) xor oddb2(4) xor oddb2(3) xor oddb2(2) xor oddb2(1) xor oddb2(0);
sout1<=tsr1(0);--數據位
tsr1(6 downto 0):=tsr1(7 downto 1);
tsr1(7):=0;
txcnt_r<=txcnt_r+1;
if (txcnt_r=7) then
state<=odd2;
end if;
when odd2=> --奇校驗位
if oddb=1 then
sout1<=0;state<=stop2;
else
sout1<=1;state<=stop2;
end if;
when stop2=>
sout1<=1; --停止位
if len=0000000000000000 then
state<=stop2;
else
state<=start1;
len<=len-1;
end if;
end case;
end if;
end process;
sout<=sout1;
end behav;
剩下的波形模擬就自己搞定。
希望這些內容對你有所幫助!!
相關內容已發到你郵箱
❿ 二叉樹的重建演算法是什麼
太難了