zoukankan      html  css  js  c++  java
  • 字符串计算 算法开源

    字符串计算 算法开源

    算法开发原因:

    自己一直在 配置化编程 方面努力,希望 项目复杂的功能可以用 简单的 配置来完成;

    于是 在自己的网站中,使用了一个自己写的 数据库框架,为了给框架提速,于是就 想将 少于 5000 的数据表 进行全表缓存;

    然后所有的 数据 就由框架 从缓存中 按照条件 检索——相当于 内存检索;

     

    这时,问题就来了 —— 整个项目,Sql 脚本的 Where 条件,千变万化;

    如何判断 某个对象 是否 符合 一个字符串的表达式,这就让我 头疼了;

     

    于是经过搜索,得到: http://bbs.csdn.net/topics/230073145

    最终的解法 是  DataTable.Compute() 函数;还有一个 是 使用微软动态编译技术 的解决方案(这个才是真正无敌的方法)。

     

    但是确有弊端:微软 动态编译技术 计算字符串表达式,即时计算 “1+1”,也需要 300ms,5000个数据的检索,这个是我所无法容忍的。

    于是就想 写一个 字符串计算 的算法;

     

     

    算法版本经历:

    算法从去年5月完成,历时 2周业余时间,完成第一版;

    今年7月开始,参与了几个 工作流项目的开发,觉着闹心:工作流 应该和 功能分开,结果我看到,代码中,业务代码和工作流代码 纵横交错;特别闹心; 

    于是就想 抽象一个流程设计器:让开发人员一心一意写业务代码,工作流的代码 全部使用配置,即时修改了流程,开发人员也不用 修改任何代码;

    而 流程设计器 的的手稿过程中,发现 不可避免 的有一个环节:条件判断——这个非得使用 字符串计算算法;

    于是 改版 第一版算法代码,得到今天的第二版 Laura.Compute;

     

     

    算法亮点:

    新版本 算法,字符串表达式 兼容 SQL脚本(和SQL脚本类似的 字符串格式);

    新版本 算法,支持 动态参数(就像 SQL中  WHERE FName=@FName 一样);

    新版本 支持 预分析,分析一次 多次执行(可用不同参数);

    运算速度 达到  (分析+计算)*20000次 = 2000ms;  分析*1次+计算*20000次 = 150ms;

    顺手实现了 字符串表达式 的内存检索(Word LIKE '%cat%'),50000单词,内存检索时间 800ms;

    顺手实现了 字符串表达式 的 内存排序(Word DESC, ID ASC),50000单词,内存排序时间 2400ms;

     

     

    算法思想:

     

     

    算法用法:

    使用代码:

    //分析一个 表达式,得到 表达式结构 对象
    ExpressSchema expressSchema3 = ExpressSchema.Create(""ShuXiaolong" IN ("ShuXiaolong","QuFuli")");
    //给定参数,计算这个 表达式结构 对象 在指定参数下 的运行结果
    object value = expressSchema3.Compute(null);
    Console.WriteLine(value);

    计算结果:

     

    其他用法:

    以上只是 一个简单的 表达式:判断 某个 字符串 是否在 一个 数组中。

    以下即为 其他 功能(这些功能 全都是 算法的 插件,任何开发人员都可以 在 任意程序集 中 扩展本算法):

    复制代码
        插件名称:                           关键字:                运算优先级:
        DateAddComputeMethod               DATEADD               1000000
        DateConvertComputeMethod           CONVERTDATE            1000000
        DateDiffComputeMethod              DATEDIFF            1000000
        DateFormatComputeMethod            DATEFORMAT           1000000
        DateNowComputeMethod               GETDATE                1000000
        DatePartComputeMethod              DATEPART               1000000
        GuidNewComputeMethod               NEWID                  1000000
    
        StringLengthComputeMethod          LEN                    1000000
        StringReplaceComputeMethod         REPLACE                1000000
    
        PowComputeSymbol                   ^                      100000
        MultiplyComputeSymbol              *                      10000
        RemainComputeSymbol                %                      10000
        DivideComputeSymbol                /                      10000
        PlusComputeSymbol                  +                      1000
        MinusComputeSymbol                 -                      1000
        LikeEqualComputeSymbol             LIKE                   700
        LessThanEqualComputeSymbol         <=                     685
        GreaterThanEqualComputeSymbol      >=                     680
        LessThanComputeSymbol              <                      675
        GreaterThanComputeSymbol           >                      670
        StrictEqualComputeSymbol           ===                    610
        EqualComputeSymbol                 ==                     605
        BaseEqualComputeSymbol             =                      600
        AndComputeSymbol                   AND                    525
        AndSignComputeSymbol               &&                     525
        OrComputeSymbol                    OR                     520
        OrSignComputeSymbol                ||                     520
        TernaryComputeSymbol               ?:                     100
        InComputeMethod                    IN                     未定(默认为 0)
    复制代码

    支持 函数表达式,运算符表达式 ,这两种类型的表达式 用的是 同一个 抽象思想;

     

     

    算法Demo展示:

    计算对象:

    复制代码
                Student stu01 = new Student { Name = "舒小龙", Number = "ShuXiaolong"};
                Student stu02 = new Student { Name = "瞿福丽", Number = "QuFuli" };
                Student stu03 = new Student { Name = "舒珊", Number = "ShuShan" };
    
                ExpressSchema expressSchema = ExpressSchema.Create("[Number] LIKE '%Shu%'");
                bool result1_1 = (bool) expressSchema.Compute(stu01);
                bool result1_2 = (bool)expressSchema.Compute(stu02);
                bool result1_3 = (bool)expressSchema.Compute(stu03);
                Console.WriteLine(result1_1 + "|" + result1_2 + "|" + result1_3);
    
                ExpressSchema expressSchema2 = ExpressSchema.Create("[Name] + [Number]");
                string result2_1 = (string)expressSchema2.Compute(stu01);
                string result2_2 = (string)expressSchema2.Compute(stu02);
                string result2_3 = (string)expressSchema2.Compute(stu03);
                Console.WriteLine(result2_1 + "|" + result2_2 + "|" + result2_3);
    复制代码

     

     

    内存排序:

    复制代码
                DataSet dataSet = GetTableRecord();  //从数据库 读取 50000 个单词
                DataTable dataWord = dataSet.Tables[0];
    
                DateTime dt7 = DateTime.Now;
                IList listResult3 = ComputeHelper.Sort("[Word],[Comment]", dataWord.Rows);  //用封装好的 排序函数 排序
                DateTime dt8 = DateTime.Now;
                Console.WriteLine("ComputeHelper.Sort()排序时间:" + (dt8 - dt7).TotalMilliseconds);
    
                Console.WriteLine(listResult3);
    复制代码

     

     

    内存筛选:

    复制代码
                DataSet dataSet = GetTableRecord();  //从数据库 读取 50000 个单词
                DataTable dataWord = dataSet.Tables[0];
    
                DateTime dt7 = DateTime.Now;
                IList listResult3 = ComputeHelper.Filter("[Word] LIKE '%cat%'", dataWord.Rows);  //用封装好的 筛选函数 筛选
                DateTime dt8 = DateTime.Now;
                Console.WriteLine("ComputeHelper.Filter()筛选时间:" + (dt8 - dt7).TotalMilliseconds);
    
                Console.WriteLine(listResult3 + " 数目:" + listResult3.Count);
    复制代码

     

     

    算法源代码:

    源码在线阅读

    Ps. 最好是能将源码 发不到某个 网络版本控制器上,但是不知道 如何操作,也不知道哪个  哪个平台 有 SVN的版本控制器;

    如果哪位有好的 网络版本控制器,希望推荐一哈——还是放到 版本控制器中 开源 比较好;

     

     
     
     
  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3356309.html
Copyright © 2011-2022 走看看