• 字符串计算 算法开源


    字符串计算 算法开源

    算法开发原因:

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

    于是 在自己的网站中,使用了一个自己写的 数据库框架,为了给框架提速,于是就 想将 少于 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的版本控制器;

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

     

     
     
     
  • 相关阅读:
    Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结
    zookeeper Eclipse 开发环境搭建及简单示例
    PHP语言基础之MySql 05 By ACReaper
    【读书笔记】并发编程需要注意的几个典型问题
    Eclipse安装SVN
    html学习
    某浪PHP面试题及答案优化
    《卡特教练》观后感
    [Usaco2006 Nov]Roadblocks第二短路
    std::vector 两种操作的比较
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3356309.html
Copyright © 2020-2023  润新知