當前位置:首頁 » 操作系統 » 組合查詢演算法

組合查詢演算法

發布時間: 2022-05-06 19:07:47

❶ 在Mysql中,把多個值以字元串組合的方式保存到一列和把各個值單獨保存到一條記錄的綜合效率分析。

索引的目的在於提高查詢效率,可以類比字典,如果要查「mysql」這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。如果沒有索引,那麼你可能需要把所有單詞看一遍才能找到你想要的。

1.索引的優點

假設你擁有三個未索引的表t1、t2和t3,每個表都分別包含數據列i1、i2和i3,並且每個表都包含了1000條數據行,其序號從1到1000。查找某些值匹配的數據行組合的查詢可能如下所示:
SELECT t1.i1, t2.i2, t3.i3 FROM t1, t2, t3 WHERE t1.i1 = t2.i2 AND t2.i1 = t3.i3;
這個查詢的結果應該是1000行,每個數據行包含三個相等的值。如果在沒有索引的情況下處理這個查詢,那麼如果我們不對這些表進行全部地掃描,我們是沒有辦法知道哪些數據行含有哪些值的。因此你必須嘗試所有的組合來查找符合WHERE條件的記錄。可能的組合的數量是1000 x 1000 x 1000(10億!),它是匹配記錄的數量的一百萬倍。這就浪費了大量的工作。這個例子顯示,如果沒有使用索引,隨著表的記錄不斷增長,處理這些表的聯結所花費的時間增長得更快,導致性能很差。我們可以通過索引這些數據表來顯著地提高速度,因為索引讓查詢採用如下所示的方式來處理:

1.選擇表t1中的第一行並查看該數據行的值。

2.使用表t2上的索引,直接定位到與t1的值匹配的數據行。類似地,使用表t3上的索引,直接定位到與表t2的值匹配的數據行。

3.處理表t1的下一行並重復前面的過程。執行這樣的操作直到t1中的所有數據行都被檢查過。

在這種情況下,我們仍然對表t1執行了完整的掃描,但是我們可以在t2和t3上執行索引查找,從這些表中直接地獲取數據行。理論上採用這種方式運行上面的查詢會快一百萬倍。當然這個例子是為了得出結論來人為建立的。然而,它解決的問題卻是現實的,給沒有索引的表添加索引通常會獲得驚人的性能提高。
-

2.索引的代價

首先,索引加快了檢索的速度,但是減慢了插入和刪除的速度,同時還減慢了更新被索引的數據列中的值的速度。也就是說,索引減慢了大多數涉及寫操作的速度。發生這種現象的原因在於寫入一條記錄的時候不但需要寫入數據行,還需要改變所有的索引。數據表帶有的索引越多,需要做出的修改就越多,平均性能的降低程度也就越大。在本文的」高效率載入數據」部分中,我們將更細致地了解這些現象並找出處理方法。

其次,索引會花費磁碟空間,多個索引相應地花費更多的磁碟空間。這可能導致更快地到達數據表的大小限制:

· 對於MyISAM表,頻繁地索引可能引起索引文件比數據文件更快地達到最大限制。

· 對於BDB表,它把數據和索引值一起存儲在同一個文件中,添加索引引起這種表更快地達到最大文件限制。

· 在InnoDB的共享表空間中分配的所有表都競爭使用相同的公共空間池,因此添加索引會更快地耗盡表空間中的存儲。但是,與MyISAM和BDB表使用的文件不同,InnoDB共享表空間並不受操作系統的文件大小限制,因為我們可以把它配置成使用多個文件。只要有額外的磁碟空間,你就可以通過添加新組件來擴展表空間。

使用單獨表空間的InnoDB表與BDB表受到的約束是一樣的,因為它的數據和索引值都存儲在單個文件中。

這些要素的實際含義是:如果你不需要使用特殊的索引幫助查詢執行得更快,就不要建立索引。

3.選擇索引

假設你已經知道了建立索引的語法,但是語法不會告訴你數據表應該如何索引。這要求我們考慮數據表的使用方式。這一部分指導你如何識別出用於索引的備選數據列,以及如何最好地建立索引:

用於搜索、排序和分組的索引數據列並不僅僅是用於輸出顯示的。換句話說,用於索引的最好的備選數據列是那些出現在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。僅僅出現在SELECT關鍵字後面的輸出數據列列表中的數據列不是很好的備選列:
SELECT col_a <- 不是備選列 FROM tbl1 LEFT JOIN tbl2 ON tbl1.col_b = tbl2.col_c <- 備選列 WHERE col_d = expr; <- 備選列
當然,顯示的數據列與WHERE子句中使用的數據列也可能相同。我們的觀點是輸出列表中的數據列本質上不是用於索引的很好的備選列。

Join子句或WHERE子句中類似col1 = col2形式的表達式中的數據列都是特別好的索引備選列。前面顯示的查詢中的col_b和col_c就是這樣的例子。如果MySQL能夠利用聯結列來優化查詢,它一定會通過減少整表掃描來大幅度減少潛在的表-行組合。

考慮數據列的基數(cardinality)。基數是數據列所包含的不同值的數量。例如,某個數據列包含值1、3、7、4、7、3,那麼它的基數就是4。索引的基數相對於數據錶行數較高(也就是說,列中包含很多不同的值,重復的值很少)的時候,它的工作效果最好。如果某數據列含有很多不同的年齡,索引會很快地分辨數據行。如果某個數據列用於記錄性別(只有」M」和」F」兩種值),那麼索引的用處就不大。如果值出現的幾率幾乎相等,那麼無論搜索哪個值都可能得到一半的數據行。在這些情況下,最好根本不要使用索引,因為查詢優化器發現某個值出現在表的數據行中的百分比很高的時候,它一般會忽略索引,進行全表掃描。慣用的百分比界線是」30%」。現在查詢優化器更加復雜,把其它一些因素也考慮進去了,因此這個百分比並不是MySQL決定選擇使用掃描還是索引的唯一因素。

索引較短的值。盡可能地使用較小的數據類型。例如,如果MEDIUMINT足夠保存你需要存儲的值,就不要使用BIGINT數據列。如果你的值不會長於25個字元,就不要使用CHAR(100)。較小的值通過幾個方面改善了索引的處理速度:

· 較短的值可以更快地進行比較,因此索引的查找速度更快了。

· 較小的值導致較小的索引,需要更少的磁碟I/O。

· 使用較短的鍵值的時候,鍵緩存中的索引塊(block)可以保存更多的鍵值。MySQL可以在內存中一次保持更多的鍵,在不需要從磁碟讀取額外的索引塊的情況下,提高鍵值定位的可能性。

對於InnoDB和BDB等使用聚簇索引(clustered index)的存儲引擎來說,保持主鍵(primary key)短小的優勢更突出。聚簇索引中數據行和主鍵值存儲在一起(聚簇在一起)。其它的索引都是次級索引;它們存儲主鍵值和次級索引值。次級索引屈從主鍵值,它們被用於定位數據行。這暗示主鍵值都被復制到每個次級索引中,因此如果主鍵值很長,每個次級索引就需要更多的額外空間。

索引字元串值的前綴(prefixe)。如果你需要索引一個字元串數據列,那麼最好在任何適當的情況下都應該指定前綴長度。例如,如果有CHAR(200)數據列,如果前面10個或20個字元都不同,就不要索引整個數據列。索引前面10個或20個字元會節省大量的空間,並且可能使你的查詢速度更快。通過索引較短的值,你可以獲得那些與比較速度和磁碟I/O節省相關的好處。當然你也需要利用常識。僅僅索引某個數據列的第一個字元串可能用處不大,因為如果這樣操作,那麼在索引中不會有太多的唯一值。

你可以索引CHAR、VARCHAR、BINARY、VARBINARY、BLOB和TEXT數據列的前綴。

使用最左(leftmost)前綴。建立多列復合索引的時候,你實際上建立了MySQL可以使用的多個索引。復合索引可以作為多個索引使用,因為索引中最左邊的列集合都可以用於匹配數據行。這種列集合被稱為」最左前綴」(它與索引某個列的前綴不同,那種索引把某個列的前面幾個字元作為索引值)。

假設你在表的state、city和zip數據列上建立了復合索引。索引中的數據行按照state/city/zip次序排列,因此它們也會自動地按照state/city和state次序排列。這意味著,即使你在查詢中只指定了state值,或者指定state和city值,MySQL也可以使用這個索引。因此,這個索引可以被用於搜索如下所示的數據列組合:
state, city, zip state, city state
MySQL不能利用這個索引來搜索沒有包含在最左前綴的內容。例如,如果你按照city或zip來搜索,就不會使用到這個索引。如果你搜索給定的state和具體的ZIP代碼(索引的1和3列),該索引也是不能用於這種組合值的,盡管MySQL可以利用索引來查找匹配的state從而縮小搜索的范圍。

不要過多地索引。不要認為」索引越多,性能越高」,不要對每個數據列都進行索引。我們在前面提到過,每個額外的索引都會花費更多的磁碟空間,並降低寫操作的性能。當你修改表的內容的時候,索引就必須被更新,甚至可能重新整理。如果你的索引很少使用或永不使用,你就沒有必要減小表的修改操作的速度。此外,為檢索操作生成執行計劃的時候,MySQL會考慮索引。建立額外的索引會給查詢優化器增加更多的工作量。如果索引太多,有可能(未必)出現MySQL選擇最優索引失敗的情況。維護自己必須的索引可以幫助查詢優化器來避免這類錯誤。

如果你考慮給已經索引過的表添加索引,那麼就要考慮你將增加的索引是否是已有的多列索引的最左前綴。如果是這樣的,不用增加索引,因為已經有了(例如,如果你在state、city和zip上建立了索引,那麼沒有必要再增加state的索引)。

讓索引類型與你所執行的比較的類型相匹配。在你建立索引的時候,大多數存儲引擎會選擇它們將使用的索引實現。例如,InnoDB通常使用B樹索引。MySQL也使用B樹索引,它只在三維數據類型上使用R樹索引。但是,MEMORY存儲引擎支持散列索引和B樹索引,並允許你選擇使用哪種索引。為了選擇索引類型,需要考慮在索引數據列上將執行的比較操作類型:

· 對於散列(hash)索引,會在每個數據列值上應用散列函數。生成的結果散列值存儲在索引中,並用於執行查詢。散列函數實現的演算法類似於為不同的輸入值生成不同的散列值。使用散列值的好處是散列值比原始值的比較效率更高。散列索引用於執行=或<=>操作等精確匹配的時候速度非常快。但是對於查詢一個值的范圍效果就非常差了:

id < 30 weight BETWEEN 100 AND 150
· B樹索引可以用於高效率地執行精確的或者基於范圍(使用操作<、<=、=、>=、>、<>、!=和BETWEEN)的比較。B樹索引也可以用於LIKE模式匹配,前提是該模式以文字串而不是通配符開頭。

如果你使用的MEMORY數據表只進行精確值查詢,散列索引是很好的選擇。這是MEMORY表使用的默認的索引類型,因此你不需要特意指定。如果你希望在MEMORY表上執行基於范圍的比較,應該使用B樹索引。為了指定這種索引類型,需要給索引定義添加USING BTREE。例如:
CREATE TABLE lookup ( id INT NOT NULL, name CHAR(20), PRIMARY KEY USING BTREE (id) ) ENGINE = MEMORY;
如果你希望執行的語句的類型允許,單個MEMORY表可以同時擁有散列索引和B樹索引,即使在同一個數據列上。

有些類型的比較不能使用索引。如果你只是通過把值傳遞到函數(例如STRCMP())中來執行比較操作,那麼對它進行索引就沒有價值。伺服器必須計算出每個數據行的函數值,它會排除數據列上索引的使用。

使用慢查詢(slow-query)日誌來識別執行情況較差的查詢。這個日誌可以幫助你找出從索引中受益的查詢。你可以直接查看日誌(它是文本文件),或者使用mysqlmpslow工具來統計它的內容。如果某個給定的查詢多次出現在」慢查詢」日誌中,這就是一個線索,某個查詢可能沒有優化編寫。你可以重新編寫它,使它運行得更快。你要記住,在評估」慢查詢」日誌的時候,」慢」是根據實際時間測定的,在負載較大的伺服器上」慢查詢」日誌中出現的查詢會多一些。

*4.建索引的幾大原則*

4.1.最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

4.2.=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

4.3.盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重復的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別欄位可能在大數據面前區分度就是0,那可能有人會問,這個比例有什麼經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的欄位我們都要求是0.1以上,即平均1條掃描10條記錄

4.4.索引列不能參與計算,保持列「干凈」,比如from_unixtime(create_time) = '2014-05-29'就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的欄位值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp('2014-05-29');

4.5.盡量的擴展索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可。

❷ 排列組合中A和C的演算法怎麼算的,查了百度都不會,求詳細點的謝謝(高中)

排列數 A(n,m) ----------即 字母A右下角n 右上角m,表示n取m的排列數
A(n,m)=n!/(n-m)!=n*(n-1)*(n-2)*……*(n-m+1)
A(n,m)等於從n 開始連續遞減的 m 個自然數的積
n取m的排列數 A(n,m) 等於從n 開始連續遞減的 m 個自然數的積
例: A(7,3)=7*6*5=210
組合數 C(n,m) ----------即 字母C右下角n 右上角m,表示n取m的排列數
C(n,m)=n!/(m!*(n-m)!)=n*(n-1)*(n-2)*……*(n-m+1)/(1*2*3*……*m)
C(n,m)等於(從n 開始連續遞減的 m 個自然數的積)除以(從1開始連續遞增的 m 個自然數的積)
n選m的組合數 C(n,m) 等於(從n 開始連續遞減的 m 個自然數的積)除以(從1開始連續遞增的 m 個自然數的積)
例: C(7,3)=7*6*5/(1*2*3)=35

❸ 【C#數組演算法】從數組中查找元素的和為M的組合

static System.Collections.Generic.List<string> sum;
static int n = 25;
private static void bind(System.Collections.Generic.List<int> list, System.Collections.Generic.List<int> source, int index, int count)
{
if (source.Count <= count && source.Sum() == n)
{
printf(source);
}
for (int i = index; i < list.Count; i++)
{
if (source.Contains(list[i]))
continue;
source.Add(list[i]);
bind(list, source, i, count + 1);
source.Remove(list[i]);
}
}
private static void printf(System.Collections.Generic.List<int> List)
{
string str = "";
for (int i = 0; i < List.Count; i++)
{
str += List[i];
if (i < List.Count - 1)
{
str += ",";
}
}
sum.Add(str);
}
static void Main(string[] args)
{
sum = new System.Collections.Generic.List<string>();
System.Collections.Generic.List<int> list = new System.Collections.Generic.List<int>() { 23, 1, 14, 204, 10, 17, 9, 2 };
bind(list, new System.Collections.Generic.List<int>(), 0, 1);
foreach (string s in sum.OrderBy(t => t.Length))
Console.WriteLine(s);
Console.ReadLine();
}

❹ 搜索引擎的排序演算法都有哪些是怎麼實現的

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數據挖掘,建立用戶模型(如用戶背景、興趣、行為、風格),提供個性化服務。

❺ 如何寫索引,讓查詢速度快

首先來看看錶是否有索引的命令
show index from 表名;
看到主鍵索引,索引類型是BTREE(二叉樹)
正是因為這個二叉樹演算法,讓查詢速度快很多,二叉樹的原理,就是取最中間的一個數,然後把大於這個數的往右邊排,小於這個數的就向左排,每次減半,然後依次類推,每次減半,形成一個樹狀結構圖
例如上面的例子,我們不使用索引的話,需要查詢11次才把編號為4的數據取出,如果加上索引,我們只需要4次就可以取出。

如大家所知道的,MySQL目前主要有以下幾種索引類型:FULLTEXT,HASH,BTREE,RTREE。
那麼,這幾種索引有什麼功能和性能上的不同呢?
FULLTEXT
即為全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以創建全文索引。值得一提的是,在數據量較大時候,現將數據放入一個沒有全局索引的表中,然後再用CREATE INDEX創建FULLTEXT索引,要比先為一張表建立FULLTEXT然後再將數據寫入的速度快很多。
全文索引並不是和MyISAM一起誕生的,它的出現是為了解決WHERE name LIKE 「%word%"這類針對文本的模糊查詢效率較低的問題。在沒有全文索引之前,這樣一個查詢語句是要進行遍歷數據表操作的,可見,在數據量較大時是極其的耗時的,如果沒有非同步IO處理,進程將被挾持,很浪費時間,當然這里不對非同步IO作進一步講解,想了解的童鞋,自行谷哥。
全文索引的使用方法並不復雜:
創建ALTER TABLE table ADD INDEX `FULLINDEX` USING FULLTEXT(`cname1`[,cname2…]);
使用SELECT * FROM table WHERE MATCH(cname1[,cname2…]) AGAINST ('word' MODE );
其中, MODE為搜尋方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。
關於這三種搜尋方式,愚安在這里也不多做交代,簡單地說,就是,布爾模式,允許word里含一些特殊字元用於標記一些具體的要求,如+表示一定要有,-表示一定沒有,*表示通用匹配符,是不是想起了正則,類似吧;自然語言模式,就是簡單的單詞匹配;含表達式的自然語言模式,就是先用自然語言模式處理,對返回的結果,再進行表達式匹配。
對搜索引擎稍微有點了解的同學,肯定知道分詞這個概念,FULLTEXT索引也是按照分詞原理建立索引的。西文中,大部分為字母文字,分詞可以很方便的按照空格進行分割。但很明顯,中文不能按照這種方式進行分詞。那又怎麼辦呢?這個向大家介紹一個Mysql的中文分詞插件Mysqlcft,有了它,就可以對中文進行分詞,想了解的同學請移步Mysqlcft,當然還有其他的分詞插件可以使用。
HASH
Hash這個詞,可以說,自打我們開始碼的那一天起,就開始不停地見到和使用到了。其實,hash就是一種(key=>value)形式的鍵值對,如數學中的函數映射,允許多個key對應相同的value,但不允許一個key對應多個value。正是由於這個特性,hash很適合做索引,為某一列或幾列建立hash索引,就會利用這一列或幾列的值通過一定的演算法計算出一個hash值,對應一行或幾行數據(這里在概念上和函數映射有區別,不要混淆)。在Java語言中,每個類都有自己的hashcode()方法,沒有顯示定義的都繼承自object類,該方法使得每一個對象都是唯一的,在進行對象間equal比較,和序列化傳輸中起到了很重要的作用。hash的生成方法有很多種,足可以保證hash碼的唯一性,例如在MongoDB中,每一個document都有系統為其生成的唯一的objectID(包含時間戳,主機散列值,進程PID,和自增ID)也是一種hash的表現。額,我好像扯遠了-_-!
由於hash索引可以一次定位,不需要像樹形索引那樣逐層查找,因此具有極高的效率。那為什麼還需要其他的樹形索引呢?
在這里愚安就不自己總結了。引用下園子里其他大神的文章:來自 14的路 的MySQL的btree索引和hash索引的區別
(1)Hash 索引僅僅能滿足"=","IN"和"<=>"查詢,不能使用范圍查詢。
由於 Hash 索引比較的是進行 Hash 運算之後的 Hash 值,所以它只能用於等值的過濾,不能用於基於范圍的過濾,因為經過相應的 Hash 演算法處理之後的 Hash 值的大小關系,並不能保證和Hash運算前完全一樣。
(2)Hash 索引無法被用來避免數據的排序操作。
由於 Hash 索引中存放的是經過 Hash 計算之後的 Hash 值,而且Hash值的大小關系並不一定和 Hash 運算前的鍵值完全一樣,所以資料庫無法利用索引的數據來避免任何排序運算;
(3)Hash 索引不能利用部分索引鍵查詢。
對於組合索引,Hash 索引在計算 Hash 值的時候是組合索引鍵合並後再一起計算 Hash 值,而不是單獨計算 Hash 值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash 索引也無法被利用。
(4)Hash 索引在任何時候都不能避免表掃描。
前面已經知道,Hash 索引是將索引鍵通過 Hash 運算之後,將 Hash運算結果的 Hash 值和所對應的行指針信息存放於一個 Hash 表中,由於不同索引鍵存在相同 Hash 值,所以即使取滿足某個 Hash 鍵值的數據的記錄條數,也無法從 Hash 索引中直接完成查詢,還是要通過訪問表中的實際數據進行相應的比較,並得到相應的結果。
(5)Hash 索引遇到大量Hash值相等的情況後性能並不一定就會比B-Tree索引高。
對於選擇性比較低的索引鍵,如果創建 Hash 索引,那麼將會存在大量記錄指針信息存於同一個 Hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表數據的訪問,而造成整體性能低下。

愚安我稍作補充,講一下HASH索引的過程,順便解釋下上面的第4,5條:
當我們為某一列或某幾列建立hash索引時(目前就只有MEMORY引擎顯式地支持這種索引),會在硬碟上生成類似如下的文件:
hash值 存儲地址
1db54bc745a1 77#45b5
4bca452157d4 76#4556,77#45cc…

hash值即為通過特定演算法由指定列數據計算出來,磁碟地址即為所在數據行存儲在硬碟上的地址(也有可能是其他存儲地址,其實MEMORY會將hash表導入內存)。
這樣,當我們進行WHERE age = 18 時,會將18通過相同的演算法計算出一個hash值==>在hash表中找到對應的儲存地址==>根據存儲地址取得數據。
所以,每次查詢時都要遍歷hash表,直到找到對應的hash值,如(4),數據量大了之後,hash表也會變得龐大起來,性能下降,遍歷耗時增加,如(5)。
BTREE
BTREE索引就是一種將索引值按一定的演算法,存入一個樹形的數據結構中,相信學過數據結構的童鞋都對當初學習二叉樹這種數據結構的經歷記憶猶新,反正愚安我當時為了軟考可是被這玩意兒好好地折騰了一番,不過那次考試好像沒怎麼考這個。如二叉樹一樣,每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。
BTREE在MyISAM里的形式和Innodb稍有不同
在 Innodb里,有兩種形態:一是primary key形態,其leaf node里存放的是數據,而且不僅存放了索引鍵的數據,還存放了其他欄位的數據。二是secondary index,其leaf node和普通的BTREE差不多,只是還存放了指向主鍵的信息.
而在MyISAM里,主鍵和其他的並沒有太大區別。不過和Innodb不太一樣的地方是在MyISAM里,leaf node里存放的不是主鍵的信息,而是指向數據文件里的對應數據行的信息.
RTREE
RTREE在mysql很少使用,僅支持geometry數據類型,支持該類型的存儲引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。
相對於BTREE,RTREE的優勢在於范圍查找.
各種索引的使用情況
(1)對於BTREE這種Mysql默認的索引類型,具有普遍的適用性
(2)由於FULLTEXT對中文支持不是很好,在沒有插件的情況下,最好不要使用。其實,一些小的博客應用,只需要在數據採集時,為其建立關鍵字列表,通過關鍵字索引,也是一個不錯的方法,至少愚安我是經常這么做的。
(3)對於一些搜索引擎級別的應用來說,FULLTEXT同樣不是一個好的處理方法,Mysql的全文索引建立的文件還是比較大的,而且效率不是很高,即便是使用了中文分詞插件,對中文分詞支持也只是一般。真要碰到這種問題,Apache的Lucene或許是你的選擇。
(4)正是因為hash表在處理較小數據量時具有無可比擬的素的優勢,所以hash索引很適合做緩存(內存資料庫)。如mysql資料庫的內存版本Memsql,使用量很廣泛的緩存工具Mencached,NoSql資料庫redis等,都使用了hash索引這種形式。當然,不想學習這些東西的話Mysql的MEMORY引擎也是可以滿足這種需求的。

❻ 四個字元串數組的排列組合

using System;
using System.IO;

public class hello
{
static void Main(String[]args){
String[] cols = {"detailJserial","userName","userConnect","userPhone"};
String[] value = {"order_serial","user_name","user_connect","user_phone"};

for(int i=0;i<cols.Length;i++){
for(int j=i+1;j<cols.Length;j++){
String strSQL="SELECT * FROM 表名 where "+cols[i]+"='"+value[i]+"' and "+cols[j]+"='"+value[i]+"'";
Console.WriteLine(strSQL);
}
}
}
}

兩個字元串數組遍歷就可以了。

❼ C語言程序設計職工信息管理系統

本著負責任的原則,像這樣的提問,據我所知程序員都不會回答。。。

❽ 望前輩相助 晚輩我不勝感激!!!

建議參考一下搜索引擎演算法

❾ C語言程序設計 求大神幫我完善下程序啊 把一些功能都補齊

覺得你這個設計明白兩點就可以了。

一個是struct,再一個就是數據結構。

typedefstruct
{
charcName[32];//姓名
intnNumber;//學號(看你學號數據范圍定義類型)
charcSex;//性別
charcGrade;//年級
//專業、班級等等
}STUDENT_UNIT;

數據結構的話,一個是你提到的鏈表,一個是CList,還有一個是CArray。

我建議是CList,或者鏈表。

所有的操作都是基於一個遍歷所有對象的操作。

以CList為例,增加就Add,刪除就Remove。查詢、統計、輸出就遍歷List的所有對象吧。

一些細節,比如按學號排序,查找演算法什麼的,可以加可以不加。

❿ 查分進化演算法如何解決排列組合最優問題

C是組合的意思,A是排列的意思,C和A沒有別的意義,不代表數值。比如A(5,2),5是下角標,2是上角標,表示從5個數中取出2個數進行排列,那麼總共有5*4=20種排列,A(5,2)=20,C同理,C(5,2)=5*4/2*1=10種組合

熱點內容
直出伺服器怎麼樣 發布:2024-10-07 15:41:36 瀏覽:476
比亞迪唐dmi哪個配置性價比 發布:2024-10-07 15:19:28 瀏覽:901
編譯器按變數 發布:2024-10-07 15:07:03 瀏覽:773
怎麼忘記電腦wifi密碼怎麼辦 發布:2024-10-07 15:02:18 瀏覽:424
安卓開發java開發 發布:2024-10-07 15:01:29 瀏覽:94
工業級安卓主板價格怎麼樣 發布:2024-10-07 14:07:57 瀏覽:627
編程先乘除 發布:2024-10-07 13:58:45 瀏覽:269
編譯內核時發生循環編譯 發布:2024-10-07 13:58:43 瀏覽:496
當下筆記本電腦什麼配置好 發布:2024-10-07 12:57:33 瀏覽:471
安卓倒車軌跡怎麼調 發布:2024-10-07 12:54:47 瀏覽:916