为什么查找东西效率不高
① 数据结构怎么使查找效率
顺序表查找算法 时间复杂度: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、属性分类法则
每个职场人士的电脑上总会有大量的各种各样内容或者说属性的文件,而这些文件可能不单是文档,还有相关的图片,视频等支撑文件。这种即使按照前面说过的方法来命名也不容易找到相关文件。这个时候不妨按照文件的属性进行分类归档。
这个属性可以是按照公司的项目归档,或者按照是文档、图片或者视频归档,并且按照文件夹收纳存放。如果觉得以文件夹收纳太麻烦,也可以以前缀的方式加入到文件名中进行管理。这样一来,在工作需要时,也可以快速的搜索到需要的文档。