『设计』Laura.Compute 设计思路
前言:
前一篇文章 《『开源』也顺手写一个 科学计算器:重磅开源》 ,继 Laura.Compute 算法开源之后,有 博客园 园友 希望公开一下 Laura.Compute算法 的 设计思路——就是本文了。
算法思想:
模拟人为思考过程的算法 —— 算法没有任何 取巧 的成分;
唯一的优势 在于 算法的抽象思想,算法的架构,算法的 先分析,后运算 的执行模式,还有 算法的 简单的插件扩展方式;
执行过程:
比方说 我们要计算 1 + 2 – 3 * 4 / 5 + LEN('ShuXiaolong'), 我们知道 最终结果 是 11.6
算法 初始化: 算法 会 寻找所有 可用的扩展插件——算法内置 插件 就多达 30多个;
算法 分析:
需用插件: 通过关键字,找出 +,-,*,/,LEN 这几个 执行插件——排除多余 不会被用到 执行插件,节省效率;
拆析表达式: 事先分析元数据和参数,按照 运算优先级,一步步 将 表达式 分析为 唯一片段,具体如下:
1 + 2 – 3 * 4 / 5 + LEN('ShuXiaolong')
{Express_0} + {Express_1} - {Express_2} * {Express_3} / {Express_4} + LEN({Express_5})
{Express_0} + {Express_1} - {Express_6} / {Express_4} + LEN({Express_5})
{Express_0} + {Express_1} - {Express_7} + LEN({Express_5})
{Express_0} + {Express_1} - {Express_7} + {Express_8}
{Express_9} - {Express_7} + {Express_8}
{Express_10} + {Express_8}
{Express_11}
算法 执行:
最后的 唯一片段 为 {Express_11},他的 参数片段 为 {Express_10},{Express_8} ,他的 运算插件 为 +;
运算插件+ 需要 先计算 {Express_10} {Express_8} 的值,
而 {Express_10} 的 参数片段 为 {Express_9},{Express_7},他的 运算插件 为 -;
以此递归 …
算法抽象:
抽象,是 一种 求同 的过程 —— 在 不同需求逻辑中,找出其共性,并 设计出 最少核心类,最易扩展性 的过程;
于是,根据 上面的 执行过程,我们 的 核心对象就是:
表达式片段对象: {Express_数字} 这是他们的 唯一键值;他具备 参数片段集合;他有 运算插件;
运算插件对象:表达式中 的 不同 关键字,对应的 运算方式 —— 还得适应 后期的修改维护;
Ps.算法的王牌之处:运算符(+-*/),函数(LEN) 使用的是 同一抽象对象,同一扩展方式;
算法元数据:
算法元数据类型包括: String,Int,Double,Boolean,Array
算法不足:
算法 最大的 不足 在于:算法 的 元数据类型 是 固定的,算法的分析 是 内置的;
—— 元数据 不具备 扩展性 是 算法 最大的不足;
最后的总结:
其实,上面的 算法拆析过程,想必 各位 已经知道 算法的核心思想了;
而至于 算法 的 内存检索,内存排序 这些 高级功能,都只是 基于算法功能 的 额外顺手 实现,并没有多少 技术含量;
『设计』Laura.Compute 设计思路的更多相关文章
- 『开源』Slithice 2013 服务器集群 设计和源码
相关介绍文章: <『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布> <『集群』001 Slithice 服务器集群 概述> <『集群』002 Sli ...
- 『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布
项目原因: 参与过各种 分布式项目,有 Socket,Remoting,WCF,当然还有最常用的可以跨平台的 WebService. 分布式编码的时间浪费: 但是,无一例外的,开发分布式程序的开发遵循 ...
- 『重构--改善既有代码的设计』读书笔记----Extract Method
在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...
- 『重构--改善既有代码的设计』读书笔记----Replace Method with Method Object
有时候,当你遇到一个大型函数,里面的临时变量和参数多的让你觉得根本无法进行Extract Method.重构中也大力的推荐短小函数的好处,它所带来的解释性,复用性让你收益无穷.但如果你遇到上种情况,你 ...
- 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支
下图Github地址:Mask_RCNN Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...
- 『计算机视觉』Mask-RCNN_训练网络其二:train网络结构&损失函数
Github地址:Mask_RCNN 『计算机视觉』Mask-RCNN_论文学习 『计算机视觉』Mask-RCNN_项目文档翻译 『计算机视觉』Mask-RCNN_推断网络其一:总览 『计算机视觉』M ...
- 『计算机视觉』FPN:feature pyramid networks for object detection
对用卷积神经网络进行目标检测方法的一种改进,通过提取多尺度的特征信息进行融合,进而提高目标检测的精度,特别是在小物体检测上的精度.FPN是ResNet或DenseNet等通用特征提取网络的附加组件,可 ...
- 『摄影欣赏』16幅 Romantic 风格照片欣赏【组图】
今天,我们将继续分享人类情感的系列文章.爱是人类最重要的感觉,也可能是各种形式的艺术(电影,音乐,书,画等)最常表达的主题 .这里有40个最美丽的爱的照片,将激励和给你一个全新的视觉角度为这种情绪.我 ...
- 『转载』Debussy快速上手(Verdi相似)
『转载』Debussy快速上手(Verdi相似) Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool,这套软体主要不是 ...
随机推荐
- MySql分类
基础 数据类型宽度 查看字段长度 数据类型 运算符 函数 查询 插入 更新 删除 索引 自定义存储过程和函数 视图 触发器 权限管理 备份和恢复 日志 优化 复制
- 一个关于group by和having子句的小例子
表结构: 要求: 查询有多个员工的工资不低于2000的部门编号(就是说如果一个部门的员工大于2000的人数有两个或两个以上就查询出来) sql语句: select [DEPARTMENT_ID],co ...
- JQ插件
什么是插件 插件(plugin)是JQuery的扩展(Extension),以JQuery的核心代码为基础,是一种遵循一定规范的应用程序接口编写出来的程序. 插件的引入 引入jquery.js文件 引 ...
- 工作中常用的Linux命令:目录
工作两三年,每天都和Linux打交道,但每每使用Linux命令的时候却会像提笔忘字般不知如何使用,常常查手册或到网上找资料.此系列文章主要是为了方便自己在使用命令时随时可查阅.鄙人才疏学浅,文中若有任 ...
- javascript将DOM事件处理程序封装为event.js 出现的低级错误记录
将 DOM 0级事件处理程序和DOM2级事件处理程序 IE事件处理程序封装为eventUtil对象,达到跨浏览器的效果.代码如下: var eventUtil = { // 添加事件句柄 addEve ...
- Oracle Stored Procedure demo
1.how to find invalid status stored procedure and recompile them? SELECT OBJECT_NAME , status FROM u ...
- selenium如何分别启动IE、firefox、chrome浏览器
1.火狐浏览器 /* * 初始化火狐浏览器 * */ public static WebDriver initFireFox(WebDriver dr) { String key = "we ...
- 如何用ZBrush确定头部五官的位置
之前和大家讲过如何在ZBrush中确定头部雕刻,在第一阶段中面数很少,只能将大型体雕刻出来,由于面数太少不能进行下面的雕刻.接下来第二阶段的调整,需要重新分布模型表面的网格,增加面数,进行五官的位置的 ...
- 图的遍历之深度优先搜索(DFS)
深度优先搜索(depth-first search)是对先序遍历(preorder traversal)的推广.”深度优先搜索“,顾名思义就是尽可能深的搜索一个图.想象你是身处一个迷宫的入口,迷宫中的 ...
- SQL里面如何取得前N条数据?
select * from table order by id limit 10 运用limit可以获取前N个数据