0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

LabVIEW统一查询工具包 过滤器模式Por的介绍

jf_NKOETB7n 来源:LabVIEW的编程之道 作者:LabVIEW的编程之道 2022-11-28 09:52 次阅读

一、过滤器模式Pro简介

前已经写过过滤器模式,这里再写一篇有以下几个方面原因:

1、前一章的算法、数据和数据规则没有分离,这里设计一个可用的工具包;

2、C#里面有统一查询语言(LINQ),里面包含数据查询、集合查询、以及排序,这篇文章也来开发一个LabVIEW的统一查询工具包,实现以上功能。

功能包含以上内容:

1、数据查询;

2、集合运算:交集、并集;

3、数据排序:升序和降序;

以上功能可以任意组合。

二、过滤器模式Pro-过滤

下图为我们设计的UML关系类图:

e69fbdde-6eac-11ed-8abf-dac502259ad0.png

1、Abstract Filter过滤器框架:定义了过滤器过滤的基本规则

2、Abstract Data需要查询的数据类型:只定义的一个tostring用于显示数据

3、Abstract Rule定义了具体数据规则

下面开始编程

1、创建一个工程命名为LLINQ,意思是LabVIEW的LINQ。

2、创建3个类分别命名为Abstract Filter、Abstract Data和Abstract Rule,在Abstract Filter私有数据中添加Abstract Rule和Abstract Data数组;并创建其数据成员访问。

e6c0c51a-6eac-11ed-8abf-dac502259ad0.png

e6e06e74-6eac-11ed-8abf-dac502259ad0.png

3、在Abstract Rule的私有数据数据中添加两个Abstract Data分别命名为RData1、RData2,并创建其数据成员访问。

e6fb4ee2-6eac-11ed-8abf-dac502259ad0.png

e70a07ca-6eac-11ed-8abf-dac502259ad0.png

5、在Abstract Rule中创建一个动态VI命名为Filter rule。

e723d65a-6eac-11ed-8abf-dac502259ad0.png

e73ffd30-6eac-11ed-8abf-dac502259ad0.png

6、在Abstract Filter中添加静态类DoFilter,这个规则比较简单,只要是符合规则就留下,不符合规则就剔除。

e758999e-6eac-11ed-8abf-dac502259ad0.png

e7794ca2-6eac-11ed-8abf-dac502259ad0.png

下边写个实际DEMO来演示下过滤模式

6.1、创建VI命名为Filer DEMO

6.2、创建一个类命名为Double data继承至Abstract Data,在私有数据添加一个double类型数据。

6.3、创建一个类命名为Greate The 0.5继承至Abstract rule,重写Filer rule。

e792f27e-6eac-11ed-8abf-dac502259ad0.png

6.4、在AbstratFIler中添加数据和过滤规则,进行过滤,然后再取出数据

e7a01cb0-6eac-11ed-8abf-dac502259ad0.png

e7c0c7bc-6eac-11ed-8abf-dac502259ad0.png

三、过滤器模式Pro-集合运算

1、并集

在Abstract Filter中创建静态方法Uniton,做法分三步

1.1、设置两个过滤器作为输入;

1.2、找出结合2中与集合1相同的部分并剔除;

1.3、合并剔除后的集合数据并保存到结果数据中。

e7f5e636-6eac-11ed-8abf-dac502259ad0.png

2、交集

在Abstract Filter中创建静态方法Intersection,做法分两步

2.1、设置两个过滤器作为输入;

2.2、取出结合2中与集合1相同的部分,保存到输出结果中。

e8230936-6eac-11ed-8abf-dac502259ad0.png

2、集合范例

下面是一个两个数组,一个是0--9的整数,一个是5--14的整数,求他们的交集和并集。

先创建一个整类继承至Abstract Rule,私有数据类型为整型,重写数据规则Filer Rule:

e839d6f2-6eac-11ed-8abf-dac502259ad0.png

3、下面是具体的使用代码:

e8590fcc-6eac-11ed-8abf-dac502259ad0.png

4、前面板结果

e870beb0-6eac-11ed-8abf-dac502259ad0.png

四、过滤器模式Pro-冒泡排序

数组排序是一个经常使用的功能,LabVIEW自带的数组排序功能只能对数值类型数据进行排序,那么簇,指定类中特定数据排序呢,每次都需要自己写非常麻烦,影响编程效率。下面写个通用的冒泡排序算法:

从最底部两个元素开始比价,如果上一个元素大于下一个元素就交换位置,然后向上挪一个位置,重复以上操作直到最顶端。最大值就像泡泡浮出水面一样,再从最底端到顶端第二个元素重复上面动作,依次循环

e897d2ca-6eac-11ed-8abf-dac502259ad0.png

e8ae5ac2-6eac-11ed-8abf-dac502259ad0.png

e8cc42da-6eac-11ed-8abf-dac502259ad0.png

这个是冒泡迭代的位置。

e8e4acf8-6eac-11ed-8abf-dac502259ad0.png

具体编码如下程序框图:

e907a94c-6eac-11ed-8abf-dac502259ad0.png

建一个double比较的数据规则

e9256a90-6eac-11ed-8abf-dac502259ad0.png

创建个DEMO生成一组随机数看看运行结果:

e93fd010-6eac-11ed-8abf-dac502259ad0.png

e9577260-6eac-11ed-8abf-dac502259ad0.png

运行下结果达到预期,我们把数据数量改成1000,2000看看运行时间

e973813a-6eac-11ed-8abf-dac502259ad0.png

e9947d9a-6eac-11ed-8abf-dac502259ad0.png

上面可以看到1000次运行时间为3.39秒,2000次运行时间为13.7秒,这个时间感觉太长了,能优化排序算法将时间缩短不?

看下一章的分治排序法。

五、过滤器模式Pro-分治排序

冒泡排序算法的时间复杂度为O(n^2)空间复杂度为O(1)

我们使用分治排序时间复杂度为O(nlog(n))空间复杂度为O(log(n))

简单介绍下原理:

固定第一个数,从最后和最前搜索,当后面大于第一个数,前面小于第一个数时就交换搜到的数据。当两个搜索指针相遇时,就交换第固定数和相遇数。交换后结果为:相遇位置数左边数小,比右边的数大。

e9baecf0-6eac-11ed-8abf-dac502259ad0.png

将其按照相遇位置前后分成两组:分别重复上面内容直到分治完成。

e9d97bac-6eac-11ed-8abf-dac502259ad0.png

下边开始编写分治算法代码,图中有需要调用相同的算法需要用到递归,我们把主体算法和递归部分分离,创建一个VI命名为Devide Core,VI属性设置如下:

e9f69b74-6eac-11ed-8abf-dac502259ad0.png

ea04e742-6eac-11ed-8abf-dac502259ad0.png

分治核心代码

ea20be0e-6eac-11ed-8abf-dac502259ad0.png

ea40e01c-6eac-11ed-8abf-dac502259ad0.png

ea5a234c-6eac-11ed-8abf-dac502259ad0.png

ea6d9f44-6eac-11ed-8abf-dac502259ad0.png

测试后1000次时间为0.58秒,2000次时间为2.20秒,比冒泡排序有了很大的改善,那么有没有更快的优化方案呢?看下边异步分治排序法。

e6822012-6eac-11ed-8abf-dac502259ad0.png

五、过滤器模式Pro-异步分治排序

eaa8f1d4-6eac-11ed-8abf-dac502259ad0.png

如上图所示,我们第一次分组后,组一执行完后再执行组二,组一和组二的数据互不干扰,那么我们将异步执行组一和组二,以空间换时间。

具体代码改造如下:

1、将数据转换为引用类型;

2、将组一和组二异步执行。

具体代码如下:

异步分治排序算法:

eac2ddf6-6eac-11ed-8abf-dac502259ad0.png

异步分治核心:

eadee2c6-6eac-11ed-8abf-dac502259ad0.png

测试代码:

eb2d48da-6eac-11ed-8abf-dac502259ad0.png

eb4a2590-6eac-11ed-8abf-dac502259ad0.png

eb6c9648-6eac-11ed-8abf-dac502259ad0.png

eb8084a0-6eac-11ed-8abf-dac502259ad0.png

有上面例子可以看出,使用异步分治排序算法,排序速度有了指数级别提升。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • LabVIEW
    +关注

    关注

    1913

    文章

    3615

    浏览量

    316871
  • 过滤器
    +关注

    关注

    1

    文章

    406

    浏览量

    18930

原文标题:LabVIEW的编程之道—过滤器模式Por

文章出处:【微信号:LabVIEW的编程之道,微信公众号:LabVIEW的编程之道】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    前置过滤器的使用寿命有多长?

    前置过滤器的使用寿命有多长? 前置过滤器的使用寿命有多长,这是一个相对而言的概念,因为它的使用寿命取决于多个因素。下面将详细介绍前置过滤器的使用寿命以及影响因素。 一、什么是前置
    的头像 发表于 12-11 11:38 489次阅读

    springboot过滤器和拦截器哪个先执行

    Spring Boot是一个用于构建Java应用程序的开发框架,它提供了许多功能和工具来简化开发和部署过程。其中两个重要的功能是过滤器和拦截器。本文将详细介绍Spring Boot过滤器
    的头像 发表于 12-03 15:00 675次阅读

    LabVIEW开发自适应降噪ANC

    。本文介绍使用自适应筛选器工具包的ANC的些实际示例。 ANC应用程序使用自适应过滤器,这些过滤器的系数会根据特定标准自动调整。通过
    发表于 11-30 19:38

    半导体微孔过滤器滤芯:精密过滤的关键

    半导体微孔过滤器滤芯是一种高效、精准的过滤装置,能够将液体中的颗粒、细菌和其他杂质进行有效去除。其核心作用主要体现在以下几个方面。
    的头像 发表于 11-02 14:27 687次阅读

    AT32F系列CAN过滤器使用

    AT32F系列 CAN过滤器使用演示AT32F系列CAN过滤器的使用方法。
    发表于 10-27 06:44

    stm8s208的can过滤器怎么设置?

    stm8s208 的 can 过滤器怎么设置?
    发表于 10-26 08:13

    如何设置AT32F4xx系列CAN过滤器

    AT32F4系列CAN过滤器配置方法
    发表于 10-23 08:01

    TSMaster几种过滤器的对比及使用

    TSMaster的4种过滤器://硬件过滤器:可以在硬件端针对数据位进行筛选过滤,硬件过滤。在硬件端阻止接收一部分不需要的报文,留更多带宽对其他报文进行接收。//数据流
    的头像 发表于 10-21 08:21 1226次阅读
    TSMaster几种<b class='flag-5'>过滤器</b>的对比及使用

    PADS Layout软件中过滤器的使用方法

    我们的PADS Layout 类似于PADS Logic一样都存在一个过滤器,我们可以根据想要选中对象的种类以及类型去确定光标选择。首先可以在菜单栏中找到过滤器选项,在“编辑-筛选条件”如图3-27所示。
    的头像 发表于 09-19 16:14 553次阅读
    PADS Layout软件中<b class='flag-5'>过滤器</b>的使用方法

    智能水肥一体化首部系统之过滤器介绍

    叠片式过滤器水流通过过滤进水口进入过滤器内,通过过滤叠片时过滤叠片在弹簧力和水力的作用下被紧紧地压在一起,杂质颗粒被截留在叠片交叉点,经过
    的头像 发表于 09-08 15:27 335次阅读
    智能水肥一体化首部系统之<b class='flag-5'>过滤器</b><b class='flag-5'>介绍</b>

    聊聊布隆过滤器

    布隆过滤器是一个精巧而且经典的数据结构。
    的头像 发表于 06-30 10:03 345次阅读
    聊聊布隆<b class='flag-5'>过滤器</b>

    赛锐特 空气过滤器完整性测试仪# 独家拍摄

    过滤器
    sinceritysmart
    发布于 :2023年06月12日 16:40:19

    过滤器模式是指什么?

    过滤器模式是指通过构造一系列不同的标准实现类,通过这些标准实现类把目标对象(通常是多个)按照对应的标准进行过滤,从而得到想要的对象(或对象组)。
    的头像 发表于 06-01 14:32 922次阅读
    <b class='flag-5'>过滤器</b><b class='flag-5'>模式</b>是指什么?

    一文解析布隆过滤器设计原理

    布隆过滤器 是一个很长的二进制向量 和一系列随机映射函数 ,用于检索一个元素是否在一个集合中 。 它的空间效率 和查询时间 都远远超过一般的算法 ,但是有一定的误判率 (函数返回 true , 意味着元素可能存在,函数返回 false ,元素必定不存在)。
    发表于 05-12 11:14 389次阅读
    一文解析布隆<b class='flag-5'>过滤器</b>设计原理