為什麼查找東西效率不高
① 數據結構怎麼使查找效率
順序表查找演算法 時間復雜度:O(N) 特點:優點,理解簡單,代碼寫起來也簡單;缺點,效率低。 利用下標遍歷數組(或其他數據結構)即可,較簡單。
順序查找表演算法-優化版 時間復雜度:O(N) 特點:與上一個一樣。 主要就是在遍歷時加上一個邊界條件,之前的版本每次加1以後都要進行判斷是否越界,然後再判斷是否和輸入值相等。
優化版可以減去判斷越界這個條件。有序表查找(先排序)特點 :優點,效率高,從時間復雜度就能看出來;缺點,前提需要有序表順序存儲。對於頻繁插入和刪除的數據集維護量可能過大。
一半一半的查找,知道這個原理,代碼寫起來不難,最主要一點是while的邊界條件,因為二分,當low=high時還需要計算(low+high)/2 是否等於 find。
因為這個位置還沒有比較過。插值查找,特點:優點,一般情況比二分更有效率。缺點,前提需要有序表順序存儲,對於頻繁插入和刪除的數據集維護量可能過大。
此外如果數據的分別是那種極端情況如{0,1,2,20000,2000001,...},插值法可能效果也不好。斐波那契查找。
特點:優點,與二分折半相比,平均性能優於二分法。缺點,如果輸入的值就在a1,效率比二分都要低。
利用索引查找,索引就是把一個關鍵字與它對應的記錄相關聯的過程。線性所以主要包括:稠密索引、分塊索引、倒排索引。
這里基本不會寫什麼代碼,因為是索引對應的,把之前的數據封裝下就可以,所以面試筆試,問的可能性不大。這塊有點偏向資料庫,所以如果面試問到也是直接問資料庫的問題。
② 為什麼``百度搜索``效率大大不如以前
網路作為全球最大的中文搜索引擎,自然是很多人依賴的搜索工具。但近年來尤其是去年來,人們發現在網路上搜索一些關鍵詞,率先進入眼簾的內容幾乎都來自「百家號」,不斷點擊「下一頁」才能看到其他網站的信息,這種搜索體驗讓人感覺不如以前。
雖然百家號上的內容,有的來自傳統媒體,有的來自自媒體,其中不乏好新聞、好文章,但也充斥著不少低質內容。這是否意味著「網路已死」?當然不是,因為百家號上的內容並非全都是垃圾,而且也能搜索到其他網站內容。但「網路已死論」也給網路發出了警示。
盡管網路回應稱「百家號內容全站佔比小於10%」,但由於靠前的搜索結果幾乎都是「百家號」的內容,這給人的感覺不太好,即網路過度推銷自己的「號」,既影響公眾搜索效率,也影響搜索結果,這種結果欠公正。
網路極力推薦「百家號」,可能有經營策略上的考量,比如出於市場競爭需要。但對於經常使用網路的網友而言,則希望網路搜索回歸到公正的立場,提供自然的搜索結果。網路可以推薦「百家號」內容,但該內容應該是自然搜索結果而不是人為控制的結果。
③ 為什麼WIN7的文件夾搜索功能比XP還差N倍啊
那是要開啟搜索范圍的,否則不會自動全盤搜索。
①索引選項,也就是為Windows7操作系統中的搜索功能提供索引,以加快搜索速度。如果經常使用搜索功能,那麼設置好搜索選項,對提高搜索效率會有用的。反之,如果不常使用這項功能,那麼也許它會產生很多垃圾,還會拖累系統運行(它有一個自動搜索的功能)。
②通常情況下,為了節約時間,操作系統中的搜索只針對用戶常用的部位進行搜索,如果新添了搜索的部位,就會有警示彈出,並提出添加到索引的提示,點擊就能加入。
③開始→控制面板→搜索選項,能看到已經建立了索引的位置,用戶可以自行添加和刪減。
④點擊 修改 就能看到是否勾選了常用部位。
⑤如果操作系統中明明有這個文件,但是搜索的時候卻找不到該文件,就可以點擊 高級 → 疑難解答 → 對搜索和索引進行疑難解答
⑥點開之後,勾選自己遇到的問題,點擊 下一步,系統就會根據需要添加更多索引位置。如果操作系統中的疑難解答不能解決問題,還有一個可能是用戶沒有這個文件夾的安全設置造成的,必須要配置system許可權即可,許可權添加到文件夾即可。
參考資料 《Windows7:[27]索引選項》http://jingyan..com/article/11c17a2c739b6ef446e39d95.html
④ 在淘寶買東西如何提高搜索效率,快速找到想要的寶貝
早期淘寶的搜索引擎還比較「重視」你的關鍵字。甚至還有高級搜索功能,來提供更精確的匹配能力,例如可以用『-』號過濾你不想要的關鍵字。慢慢的,這個搜索引擎效率就越來越低了。憑使用經歷,它大致經歷了如下幾個階段:
精確期,如前文描述。
抑制二手商品,人為將高價商品排序靠前,或者花錢購買推廣的商品排序靠前時期。
將不掙錢又糾紛多的二手徹底剝離出去以後,進入了「智能化」搜索時代。這個時期,你的搜索關鍵字並不是搜索引擎全部的工作基礎。它很有可能結合了你平時的瀏覽習慣,購買傾向,消費能力,活躍度,向你人為推送不屬於搜索結果的內容。這時候你用任意關鍵字都有返回結果,雖然不著邊際,亂七八糟。但是估計淘寶的經營者認為他比你聰明。他知道如何引導你花錢。即便向你提供跟搜索主題完全無關的內容,也總比什麼也不返回要更有可能讓你掏錢。大致的指導思想就是如此。
所以,在這樣的背景之下,你不太可能精確按照自己的想法使用這種購物搜索引擎了。准確地說,它過去是為你服務的,因為怕你不來。現在,它為盈利服務,因為怕你不買。總之就是越用越費勁。檢索效率巨低無比。商品同質化嚴重,千篇一律,翻上百頁都一樣。電子購物的便利性所剩無幾。加上近年來利用價格排序機制免費薅淘寶羊毛的商家越來越多,大都標個低價,吸引顧客。商品另有價格,進一步導致檢索效率更低。
死心吧。購物平台也不是淘寶一家,選擇多的是,哪家好用用哪家。
⑤ 如何提高網路檢索的效率
要提高網路檢索的效率要從查出率和查准率出發,那麼如何提高檢索的查出率和查准率?
網路檢索需要技巧,想提高檢索的效率。
(一)首先要明確檢索目的和要求,確定查詢策略,選擇合適的網路檢索工具
1、一般性的瀏覽查詢或強調獲取較為綜合、准確的信息時,應使用目錄型檢索工具,如Yahoo!;
2、細節查詢或強調獲取較為具體、特定的信息時,應使用如網路之類的索引式搜索引擎;
3、區分學術性檢索工具和商業性檢索工具,如WWW Virtual Library 與 Yahoo!。。
(二)其次提高檢索的查准率,即提高檢索的精度、准確性
1、選擇合適的檢索詞,盡量使用專指詞、特定概念或非常用詞,避免普通詞、泛指概念;
2、構造恰當的檢索提問,學會利用檢索工具所規定的AND、OR、NOT等邏輯符、引號等檢索符號;
3、使用限定條件、限定詞,充分利用檢索界面上提供的限制條件,如語種、時間、類型、數量等;
4、利用進階、精練檢索功能,「Refine」或「二次檢索」;
5、學會使用元詞和域名,對待查事項進行查找范圍的限定。
(三)再次提高檢索的查出率,即擴大檢索范圍
1、使用同義詞、近義詞;
2、使用多個搜索引擎或者元搜索引擎,如metacrawler、萬緯搜索等;
3、利用某些搜索引擎的自動擴檢功能,如「More like this」、「相關網頁」等。
⑥ 困惑:為什麼用電腦查資料的效率很低
1、明確目的,首先要知道自己在找什麼;
2、集中注意力,不要在找資料的時候被其他無關資料吸引;
3、有效利用搜索引擎的快照功能,通常使你的搜索效率事半功倍。
⑦ 如何提高搜索的效率和准確性
你想提高你的搜索的准確率,最好的辦法有兩種:
第一,你先把你要你搜索的東西編成一句話進行搜索。
第二,你把你要搜索的東西切成幾個精簡的關鍵詞語,然後一個一個的進行搜索。
⑧ 影響數據檢索效率的幾個因素
影響數據檢索效率的幾個因素
數據檢索有兩種主要形態。第一種是純資料庫型的。典型的結構是一個關系型數據,比如 mysql。用戶通過 SQL 表達出所需要的數據,mysql 把 SQL 翻譯成物理的數據檢索動作返回結果。第二種形態是現在越來越流行的大數據玩家的玩法。典型的結構是有一個分區的數據存儲,最初這種存儲就是原始的 HDFS,後來開逐步有人在 HDFS 上加上索引的支持,或者乾脆用 Elasticsearc 這樣的數據存儲。然後在存儲之上有一個分布式的實時計算層,比如 Hive 或者 Spark SQL。用戶用 Hive SQL 提交給計算層,計算層從存儲里拉取出數據,進行計算之後返回給用戶。這種大數據的玩法起初是因為 SQL 有很多 ad-hoc 查詢是滿足不了的,乾脆讓用戶自己寫 map/rece 想怎麼算都可以了。但是後來玩大了之後,越來越多的人覺得這些 Hive 之類的方案查詢效率怎麼那麼低下啊。於是一個又一個項目開始去優化這些大數據計算框架的查詢性能。這些優化手段和經典的資料庫優化到今天的手段是沒有什麼兩樣的,很多公司打著搞計算引擎的旗號干著重新發明資料庫的活。所以,回歸本質,影響數據檢索效率的就那麼幾個因素。我們不妨來看一看。
數據檢索乾的是什麼事情
定位 => 載入 => 變換
找到所需要的數據,把數據從遠程或者磁碟載入到內存中。按照規則進行變換,比如按某個欄位group by,取另外一個欄位的sum之類的計算。
影響效率的四個因素
讀取更少的數據
數據本地化,充分遵循底層硬體的限制設計架構
更多的機器
更高效率的計算和計算的物理實現
原則上的四點描述是非常抽象的。我們具體來看這些點映射到實際的資料庫中都是一些什麼樣的優化措施。
讀取更少的數據
數據越少,檢索需要的時間當然越少了。在考慮所有技術手段之前,最有效果的恐怕是從業務的角度審視一下我們是否需要從那麼多的數據中檢索出結果來。有沒有可能用更少的數據達到同樣的效果。減少的數據量的兩個手段,聚合和抽樣。如果在入庫之前把數據就做了聚合或者抽樣,是不是可以極大地減少查詢所需要的時間,同時效果上並無多少差異呢?極端情況下,如果需要的是一天的總訪問量,比如有1個億。查詢的時候去數1億行肯定快不了。但是如果統計好了一天的總訪問量,查詢的時候只需要取得一條記錄就可以知道今天有1個億的人訪問了。
索引是一種非常常見的減少數據讀取量的策略了。一般的按行存儲的關系型資料庫都會有一個主鍵。用這個主鍵可以非常快速的查找到對應的行。KV存儲也是這樣,按照Key可以快速地找到對應的Value。可以理解為一個Hashmap。但是一旦查詢的時候不是用主鍵,而是另外一個欄位。那麼最糟糕的情況就是進行一次全表的掃描了,也就是把所有的數據都讀取出來,然後看要的數據到底在哪裡,這就不可能快了。減少數據讀取量的最佳方案就是,建立一個類似字典一樣的查找表,當我們找 username=wentao 的時候,可以列舉出所有有 wentao 作為用戶名的行的主鍵。然後拿這些主鍵去行存儲(就是那個hashmap)里撈數據,就一撈一個准了。
談到索引就不得不談一下一個查詢使用了兩個欄位,如何使用兩個索引的問題。mysql的行為可以代表大部分主流資料庫的處理方式:
基本上來說,經驗表明有多個單欄位的索引,最後資料庫會選一最優的來使用。其餘欄位的過濾仍然是通過數據讀取到內存之後,用predicate去判斷的。也就是無法減少數據的讀取量。
在這個方面基於inverted index的數據就非常有特點。一個是Elasticsearch為代表的lucene系的資料庫。另外一個是新銳的druid資料庫。
效果就是,這些資料庫可以把單欄位的filter結果緩存起來。多個欄位的查詢可以把之前緩存的結果直接拿過來做 AND 或者 OR 操作。
索引存在的必要是因為主存儲沒有提供直接的快速定位的能力。如果訪問的就是資料庫的主鍵,那麼需要讀取的數據也就非常少了。另外一個變種就是支持遍歷的主鍵,比如hbase的rowkey。如果查詢的是一個基於rowkey的范圍,那麼像hbase這樣的資料庫就可以支持只讀取到這個范圍內的數據,而不用讀取不再這個范圍內的額外數據,從而提高速度。這種加速的方式就是利用了主存儲自身的物理分布的特性。另外一個更常見的場景就是 partition。比如 mysql 或者 postgresql 都支持分區表的概念。當我們建立了分區表之後,查找的條件如果可以過濾出分區,那麼可以大幅減少需要讀取的數據量。比 partition 更細粒度一些的是 clustered index。它其實不是一個索引(二級索引),它是改變了數據在主存儲內的排列方式,讓相同clustered key的數據彼此緊挨著放在一起,從而在查詢的時候避免掃描到無關的數據。比 partition 更粗一些的是分庫分表分文件。比如我們可以一天建立一張表,查詢的時候先定位到表,再執行 SQL。比如 graphite 給每個 metric 創建一個文件存放採集來的 data point,查詢的時候給定metric 就可以定位到一個文件,然後只讀取這個文件的數據。
另外還有一點就是按行存儲和按列存儲的區別。按列存儲的時候,每個列是一個獨立的文件。查詢用到了哪幾個列就打開哪幾個列的文件,沒有用到的列的數據碰都不會碰到。反觀按行存儲,一張中的所有欄位是彼此緊挨在磁碟上的。一個表如果有100個欄位,哪怕只選取其中的一個欄位,在掃描磁碟的時候其餘99個欄位的數據仍然會被掃描到的。
考慮一個具體的案例,時間序列數據。如何使用讀取更少的數據的策略來提高檢索的效率呢?首先,我們可以保證入庫的時間粒度,維度粒度是正好是查詢所需要的。如果查詢需要的是5分鍾數據,但是入庫的是1分鍾的,那麼就可以先聚合成5分鍾的再存入資料庫。對於主存儲的物理布局選擇,如果查詢總是針對一個時間范圍的。那麼把 timestamp 做為 hbase 的 rowkey,或者 mysql 的 clustered index 是合適。這樣我們按時間過濾的時候,選擇到的是一堆連續的數據,不用讀取之後再過濾掉不符合條件的數據。但是如果在一個時間范圍內有很多中數據,比如1萬個IP,那麼即便是查1個IP的數據也需要把1萬個IP的數據都讀取出來。所以可以把 IP 維度也編碼到 rowkey 或者 clustered index 中。但是假如另外還有一個維度是 OS,那麼查詢的時候 IP 維度的 rowkey 是沒有幫助的,仍然是要把所有的數據都查出來。這就是僅依靠主存儲是無法滿足各種查詢條件下都能夠讀取更少的數據的原因。所以,二級索引是必要的。我們可以把時間序列中的所有維度都拿出來建立索引,然後查詢的時候如果指定了維度,就可以用二級索引把真正需要讀取的數據過濾出來。但是實踐中,很多資料庫並不因為使用了索引使得查詢變快了,有的時候反而變得更慢了。對於 mysql 來說,存儲時間序列的最佳方式是按時間做 partition,不對維度建立任何索引。查詢的時候只過濾出對應的 partition,然後進行全 partition 掃描,這樣會快過於使用二級索引定位到行之後再去讀取主存儲的查詢方式。究其原因,就是數據本地化的問題了。
[page]
數據本地化
數據本地化的實質是軟體工程師們要充分尊重和理解底層硬體的限制,並且用各種手段規避問題最大化利用手裡的硬體資源。本地化有很多種形態
最常見的最好理解的本地化問題是網路問題。我們都知道網路帶寬不是無限的,比本地磁碟慢多了。如果可能盡量不要通過網路去訪問數據。即便要訪問,也應該一次抓取多一些數據,而不是一次搞一點,然後搞很多次。因為網路連接和來回的開銷是非常高的。這就是 data locality 的問題。我們要把計算盡可能的靠近數據,減少網路上傳輸的數據量。
這種帶寬引起的本地化問題,還有很多。網路比硬碟慢,硬碟比內存慢,內存比L2緩存慢。做到極致的資料庫可以讓計算完全發生在 L2 緩存內,盡可能地避免頻繁地在內存和L2之間倒騰數據。
另外一種形態的問題化問題是磁碟的順序讀和隨機讀的問題。當數據彼此靠近地物理存放在磁碟上的時候,順序讀取一批是非常快的。如果需要隨機讀取多個不連續的硬碟位置,磁頭就要來回移動從而使得讀取速度快速下降。即便是 SSD 硬碟,順序讀也是要比隨機讀快的。
基於盡可能讓數據讀取本地化的原則,檢索應該盡可能地使用順序讀而不是隨機讀。如果可以的話,把主存儲的row key或者clustered index設計為和查詢提交一樣的。時間序列如果都是按時間查,那麼按時間做的row key可以非常高效地以順序讀的方式把數據拉取出來。類似地,按列存儲的數據如果要把一個列的數據都取出來加和的話,可以非常快地用順序讀的方式載入出來。
二級索引的訪問方式典型的隨機讀。當查詢條件經過了二級索引查找之後得到一堆的主存儲的 key,那麼就需要對每個 key 進行一次隨機讀。即便彼此僅靠的key可以用順序讀做一些優化,總體上來說仍然是隨機讀的模式。這也就是為什麼時間序列數據在 mysql 里建立了索引反而比沒有建索引還要慢的原因。
為了盡可能的利用順序讀,人們就開始想各種辦法了。前面提到了 mysql 里的一行數據的多個列是彼此緊靠地物理存放的。那麼如果我們把所需要的數據建成多個列,那麼一次查詢就可以批量獲得更多的數據,減少隨機讀取的次數。也就是把之前的一些行變為列的方式來存放,減少行的數量。這種做法的經典案例就是時間序列數據,比如可以一分鍾存一行數據,每一秒的值變成一個列。那麼行的數量可以變成之前的1/60。
但是這種行變列的做法在按列存儲的資料庫里就不能直接照搬了,有些列式資料庫有column family的概念,不同的設置在物理上存放可能是在一起的也可能是分開的。對於 Elasticsearch 來說,要想減少行的數量,讓一行多pack一些數據進去,一種做法就是利用 nested document。內部 Elasticsearch 可以保證一個 document 下的所有的 nested document是物理上靠在一起放在同一個 lucene 的 segment 內。
網路的data locality就比較為人熟知了。map rece的大數據計算模式就是利用map在數據節點的本地把數據先做一次計算,往往計算的結果可以比原數據小很多。然後再通過網路傳輸匯總後做 rece 計算。這樣就節省了大量網路傳輸數據的時間浪費和資源消耗。現在 Elasticsearch 就支持在每個 data node 上部署 spark。由 spark 在每個 data node 上做計算。而不用把數據都查詢出來,用網路傳輸到 spark 集群里再去計算。這種資料庫和計算集群的混合部署是高性能的關鍵。類似的還有 storm 和 kafka 之間的關系。
網路的data locality還有一個老大難問題就是分布式大數據下的多表join問題。如果只是查詢一個分布式表,那麼把計算用 map rece 表達就沒有多大問題了。但是如果需要同時查詢兩個表,就意味著兩個表可能不是在物理上同樣均勻分布的。一種最簡單的策略就是找出兩張表中最小的那張,然後把表的內容廣播到每個節點上,再做join。復雜一些的是對兩個單表做 map rece,然後按照相同的 key 把部分計算的結果匯集在一起。第三種策略是保證數據分布的方式,讓兩張表查詢的時候需要用到的數據總在一起。沒有完美的方案,也不大可能有完美的方案。除非有一天網路帶寬可以大到忽略不計的地步。
更多的機器
這個就沒有什麼好說的了。多一倍的機器就多一倍的 CPU,可以同時計算更多的數據。多一倍的機器就多一倍的磁頭,可以同時掃描更多的位元組數。很多大數據框架的故事就是講如何如何通過 scale out解決無限大的問題。但是值得注意的是,集群可以無限大,數據可以無限多,但是口袋裡的銀子不會無限多的。堆機器解決問題比升級大型機是要便宜,但是機器堆多了也是非常昂貴的。特別是 Hive 這些從一開始就是分布式多機的檢索方案,剛開始的時候效率並不高。堆機器是一個乘數,當資料庫本來單機性能不高的時候,乘數大並不能起到決定性的作用。
更高效的計算和計算實現
檢索的過程不僅僅是磁碟掃描,它還包括一個可簡單可復雜的變換過程。使用 hyperloglog,count min-sketch等有損演算法可以極大地提高統計計算的性能。資料庫的join也是一個經常有演算法創新的地方。
計算實現就是演算法是用C++實現的還是用java,還是python實現的。用java是用大Integer實現的,還是小int實現的。不同的語言的實現方式會有一些固定的開銷。不是說快就一定要C++,但是 python 寫 for 循環是顯然沒有指望的。任何數據檢索的環節只要包含 python/ruby 這些語言的逐條 for 循環就一定快不起來了。
結論
希望這四點可以被記住,成為一種指導性的優化數據檢索效率的思維框架。無論你是設計一個mysql表結構,還是優化一個spark sql的應用。從這四個角度想想,都有哪些環節是在拖後腿的,手上的工具有什麼樣的參數可以調整,讓隨機讀變成順序讀,表結構怎麼樣設計可以最小化數據讀取的量。要做到這一點,你必須非常非常了解工具的底層實現。而不是盲目的相信,xx資料庫是最好的資料庫,所以它一定很快之類的。如果你不了解你手上的資料庫或者計算引擎,當它快的時候你不知道為何快,當它慢的時候你就更加無從優化了。
⑨ 影響數據查詢效率的因素有哪些
1、調整數據結構的設計.這一部分在開發信息系統之前完成,程序員需要考慮是否使用ORACLE資料庫的分區功能,對於經常訪問的資料庫表是否需要建立索引等.
2、調整應用程序結構設計.這一部分也是在開發信息系統之前完成,程序員在這一步需要考慮應用程序使用什麼樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構.不同的應用程序體系結構要求的資料庫資源是不同的.
⑩ 有幾種提高文件搜索效率的措施
1、詳盡關鍵詞法則
根據文件記錄的內容,提煉相關的關鍵字,並盡可能的將相關關鍵詞串聯成一個簡單的語句。這樣一來既可以區別各個文件,也可以很快地幫助你找到對應的文件。
2、時序人事編號法則
經常幫領導寫文章的職場人士肯定都會遇見過這么一種情況:領導讓寫一篇講話稿,結果根據這么一份初稿,一天內來回改了好幾次。有時候可能改了好幾稿以後,領導突然覺得前面幾稿中某些文字還不錯想重新使用,結果因為沒有備份或者文件名混亂找不回來了。
這個時候其實只需要根據時序人事進行編號保存,改多少稿都不怕。而其中的時序人事則指的是文件名中最少需要包含:保存時間、編輯序號、相關人物、內容事項。
3、屬性分類法則
每個職場人士的電腦上總會有大量的各種各樣內容或者說屬性的文件,而這些文件可能不單是文檔,還有相關的圖片,視頻等支撐文件。這種即使按照前面說過的方法來命名也不容易找到相關文件。這個時候不妨按照文件的屬性進行分類歸檔。
這個屬性可以是按照公司的項目歸檔,或者按照是文檔、圖片或者視頻歸檔,並且按照文件夾收納存放。如果覺得以文件夾收納太麻煩,也可以以前綴的方式加入到文件名中進行管理。這樣一來,在工作需要時,也可以快速的搜索到需要的文檔。