• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C# 撒列实现关键字过滤的实例

C# 撒列实现关键字过滤的实例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#关键字,c#base关键字,c#关键字详解,c#中out关键字,c#this关键字等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一直对搜索、过滤很好奇,觉得他们很有技术含量,只有非常NB的人才能做。很想知道他们的原理,实现这样的功能,设计是不是必须得非常NB非常奇特,代码是不是要写得非常好,性能非常高。总之这一切都不是我这样级别的人能做的。直到我看了《编程珠玑(第二版)》中的这么一段文字:

“假定我们可以在执行搜索之前对文本内容进行预处理,那么我们可以建立一个撒列表(或者搜索树),为文档中的每个不同的单词建立索引,并为每个单词的每次出现存储一个链表,这样的逆向索引使得程序可以很快的找到给定的单词,为了查找短语,我们可以对其中包含的每个单词的链表进行交叉,但实现起来比较复杂,速度可能会很慢。(不过一些网页搜索引擎用的就是这样的方法)”

思路就这么简单,我靠!连有的搜索引擎也用这种思路。这种撒列的方式处理关键字过滤速度的确是蛮快,10000个字组织成一个撒列表也就几毫秒,只要你预分配的内存较好,基本上没什么操作,就是向内存中填数据。在撒列表中判断一个键是否存在的时间复杂度为O(1),其实还可以自己重写Dictionary<TKey, TValue>,关键字过滤的效率可能会更好点。

实现的思路比较简单:

1:处理关键字,生成一个关键字字典表

2:处理要过滤的文本,同样生成一个字典表

3:将文本,两个字典表三者进行比对

现在来测试下面一段文字(我上篇博客中的一段文字):

"看云风博客关于解决12306并发问题的启发:我现在做骏卡接口,可能出现并发问题,就是一个订单可能向我们的接口发送多个请求,而我现在做的方法是去数据库中对应的表验证,看订单是否存在,如果存在就提示一下,如果不存在按流程走,但是这个样每来一个订单我都需要去数据库查,如果我在内存中维护一个订单集合,这样就能很快解决判断订单是否存在的问题,惯性思维太严重了,什么都去数据库查,这样的性能是最差的,其实很多问题在内存中就可以搞定的,最近还有一个特别感受,不要做井底之蛙,多看牛人的东西收获真的比自己埋头写代码进步快很多,其实很多时候我写的程序性能差,效率低都是因为方法的原因,没有找到好的方法,没有灵光一闪的感觉,用了最烂的方法解决问题"

测试代码:

    }
</div>
输出结果截图:

另外送上一个简单实用的代码运行时间测试类,测试某段代码的运行时间可是很方便的哦

namespace WordFilter
{
    /// <summary>
    /// 测试代码运行时间帮组类
    /// </summary>
    public class OperationTimer : IDisposable
    {
        private string Text;
        private Int32 collectCount;
        private Stopwatch stopWatch;

        public OperationTimer(string txt)
        {
            PerpareForOperation();
            this.Text = txt;
            collectCount = GC.CollectionCount(0);
            stopWatch = new Stopwatch();
            stopWatch.Start();
        }

        public void Dispose()
        {
            stopWatch.Stop();
            Console.WriteLine("{0} Milliseconds (GCs={1}) {2}", stopWatch.ElapsedMilliseconds, GC.CollectionCount(0) - collectCount, Text);
        }

        private static void PerpareForOperation()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
        }
    }
}
</div>
实现撒列的部分核心代码:

            Dictionary<char, ILis

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C# this关键字的四种用法
  • C#编程总结(六)详解异步编程
  • c#中SqlTransaction——事务详解
  • C#给Excel添加水印实例详解
  • C#枚举类型和结构体详解
  • C#调用Java方法实例详解
  • C#获取机器码的方法详解(机器名,CPU编号,硬盘编号,网卡mac等)
  • C#同步网络时间的方法实例详解
  • C#使用this关键字实现串联构造函数调用方法
  • C#中的预处理器指令详解

相关文章

  • 2017-05-28C#类的访问修饰符用法分析
  • 2017-05-28C#将字节数组转换成数字的方法
  • 2017-05-28C#简单实现SNMP的方法
  • 2017-05-28逐步讲解快速排序算法及C#版的实现示例
  • 2017-05-28C#中文件名或文件路径非法字符判断方法
  • 2017-05-28C#中把英文字母转换为大写或小写的方法
  • 2017-05-28C#函数式编程中的惰性求值详解
  • 2017-05-28c# 网址压缩简单实现短网址
  • 2017-05-28c#读取xml文件到datagridview实例
  • 2017-05-28c#获取本机在局域网ip地址的二种方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入多线程之:深入分析Interlocked
    • C#实现Ping的方法小结
    • C#使用Process类调用外部exe程序
    • C# 递归查找树状目录实现方法
    • C# 实例化接口对象的方法
    • WinForm中BackgroundWorker控件用法简单实例
    • C# 泛型数组学习小结
    • C#几种截取字符串的方法小结
    • C#使用List类实现动态变长数组的方法
    • C#实现的微信网页授权操作逻辑封装示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有