用于程序搜索的智能融合算法的设计与实现(C++,已用于程序中)

数据可视化—power bi 基础操作汇总 数据来源: https://pan.baidu.com/s/1U_Y7rKfhnSKbLmh4FcUD_Q 提取码: yq5v 目录 基本功能与视图 编辑与查询—修改column案例 建立关联性 新增column与DAX完成总价运算 习题练习1:建立可视化图表 产品销售统计图 column拖曳可视化 1.基本功能与视图 ①基础操作界面 ②获取数据—以打开excel为例 ③数据文件基本视图 可视化形式:柱状图、数据、关联性 2.编辑与查询—修改column ①编辑与查询—数据处理界面 . 阅读详情

该程序搜索算法是我最近写的软件中使用到的算法,软件的项目地址如下:https://github.com/ghost-him/QuickLaunch/。建议打开源码,找到对应的代码后再阅读本文章。

该算法已经应用在软件中,并且取得了令我自己很满意的效果。

前言结束,以下是正文:


程序搜索算法介绍

该程序使用了融合算法来实现查找目标应用程序。搜索算法的实现位于model文件夹下的database类中。可以对着源码来查看本文档。

该搜索算法的特点是:

  • 可以用极少的字符匹配超长字符
  • 支持拼音(全拼与首字母拼音)搜索
  • 支持模糊查找

算法的总体流程

先对算法的运行流程熟悉后再对具体实现有所了解。

  1. 程序在初始化时,会根据配置读取电脑上安装的程序,并向database类中添加对应的记录。(通过insertProgramInfo函数添加)。
  2. 用户在按下alt + space后,会弹出来搜索栏,每当用户向其中输入一个字符(或删除一个字符),则会调用一次database类中的updateProgramInfo函数,而传入的参数则是当前搜索栏中的字符。
    1. updateProgramInfo会计算当前用户输入的字符串与存储的所有的记录的匹配度(programLevel)
    2. 根据匹配度对所有的内容进行从小到大的排序
  3. uiController会选择指定的前几个记录作为显示项,将其添加到QListWidget中,显示给用户。

从以上的流程可以知道:

  • 每当用户输入一个字符,程序都会运行一次搜索算法
  • 算法的核心是根据用户输入的字符串计算每一个programNode中programLevel的值
  • 显示出来的匹配项为所有的programNode中programLevel最小的几个。

数据结构定义

对于一个程序,使用ProgramNode来维护,该结构体的定义如下:

struct ProgramNode {
    std::wstring programName;

    std::wstring compareName;
    std::wstring pinyinName;
    std::wstring firstLatterName;

    std::wstring programPath;
    double programLevel;
    int stableLevel;
    int launchTime;

    const bool operator<(const ProgramNode& other) const {
        if (programLevel != other.programLevel) {
            return programLevel < other.programLevel;
        } else if (launchTime != other.launchTime) {
            return launchTime > other.launchTime;
        } else {
            return compareName < other.compareName;
        }
    }
};

以下是字段的解释:

  • programName:该字段用于在界面中显示程序的名字,不参与搜索算法。
  • compareName:该字段用于精确匹配程序的名字。在插入数据时,会先进行预处理:
    • 将大字字母全部转换为小写字母(OneNote -> onenote)
    • 将括号内的内容全部去除(qt creator 13.0.2 (community)->qt creator 13.0.2 )
  • pinyinName:该字段用于存储中文名字的程序的拼音(网易云音乐->wang yi yun yin le,因 乐 字存在多音字的情况,所以无法正确匹配拼音)
  • firstLatterName:该字段用于存储中文名字的程序的拼音首字母(网易云音乐->wyyyl)
  • programPath:该字段用于存储该程序在磁盘中的位置
  • programLevel:该字段用于存储该程序的总权重
  • stableLevel:该字段用于存储程序的固定权重
  • launchTime:该字段用于存储程序的启动次数

具体流程

programLevel的值取决于以下三个值:directValue,pinyinValue,firstLatterValue,其意思分别是:精确匹配的匹配值,使用拼音匹配的匹配值,使用拼音首字母匹配的匹配值。而programLevel的值取这三个中最小的那个。

至于三个值的计算均由computeCombinedValue函数完成,该函数也是程序搜索算法的核心。

该函数有两个参数:storeName与inputName,storeName表示存储的程序的名字,而inputName表示用户输入的程序的名字。融合算法由以下三种子算法构成:

  1. 最短编辑距离变体
  2. KMP算法变体
  3. 最长公共子序列变体

除了以上的子算法,还有其他的条件来确保匹配:

  • 判断输入的长度是否大于程序的名字的长度(精确名字与拼音名字的最大值),如果已经大于程序的长度了,则一定不是该程序(在运行时,如果不设置该条件,则会存在无法匹配到拥有长程序名的程序)。

最短编辑距离变体

最短编辑距离变体算法由editSubstrDistance函数实现,左边为内存中存储的字符串,而右边为用户输入的字符串。

该函数的计算流程是:当用户输入的字符串中,最少经过[添加一个字符|删除一个字符|修改一个字符]几次后可以变为左边的子字符串。并且计算修改的次数占总输入数据长度的比值 x x x(通过除法,将值映射为[0-1]区间内)。并使用 y ( x ) = 25 ∗ 3 3 ∗ x − 2 y(x)=25*3^{3*x-2} y(x)=25∗33∗x−2函数将其映射到 [ 2.7 , 75 ] [2.7, 75] [2.7,75]之间。(该函数没有特别设计,关键是一个指数函数,且 y ( x ) y(x) y(x)足够小, y ( 1 ) y(1) y(1)足够大,凹函数)

至于为什么这样设计,可以这样理解:如果我输入了5个字符,比如steam,但是这5个字符,需要修改4次,才可以成为deepl的一个子字符串,那么有极大的概率查找的不是这个程序。相反,我输入的这5个字符无须修改就可以成为steam的一个子字符串,那么说明我查找的程序很有可能就是这个程序。综上所述,steam的programLevel会比deepl的programLevel小。

以下是计算的过程,输入的字符串为steam

  • 对于程序steam来说:修改0次(steam->steam),则比值min_operations为 0 / 5 = 0 0/5=0 0/5=0。再经过函数的映射,可以得到directValue为2.77。
  • 对于程序deepl来说:修改4次(steam->deepl),则比值min_operations为 4 / 5 = 0.8 4/5=0.8 4/5=0.8。再经过函数的映射,可以得到directValue为38.79

为什么要使用指数函数将其扩大?

  • 为了方便后续的处理。当输入steam时,可能会匹配其他的选择,比如steam support center。此时,如果单纯的使用该算法作为判断依据,则无法处理这个情况(两者的值一样)

KMP算法变体

KMP算法变体由kmp函数实现,其具体的处理过程如下:

  1. 如果输入的字符串是一个程序的子字符串,则返回其输入长度的负值。
  2. 如果输入的字符串不但是程序的子字符串,同时程序还是以该字符串开头的,则返回2倍的负的输入长度

通过该算法可以实现:如果我输入command,那么command prompt的值会比developer command prompt for vs 2022小,可以实现前者排在后者的上面,优先被选中。

注意:该函数返回的值是一个负值。相加时可以减少programLevel的值,从而提高匹配程序的排名。

最长公共子序列变体

最长公共子序列算法求的是输入字符串与目标字符串的最长的公共子序列的长度。比如:

text1 = "abcde", text2 = "ace" 
输出:3  
解释:最长公共子序列是 "ace" ,它的长度为 3 。

以上数据来源:力扣

在本程序中,使用LCS函数实现。当该函数计算完子序列的长度previous[n]时,会计算该子序列相对于输入字符串与目标字符串的差值。即:m + n - 2 * previous[n]。这样可以防止输入steam时,steam与steam support center的值一样,可以优先匹配长度更短的字符串。同时,使用该算法可以弥补最短编辑距离变体的缺点。由于该算法对于结果的影响较大(比如以上例子,匹配steam support center时,该函数运行的结果为15,会对结果造成很大的影响,可能排在第二位的选项不是该程序而是其他完全不相关的程序),所以在融合算法中,差其权重设置为了0.2,从而来减小影响。

Palantir解密:“本体”的建模逻辑及其扩展方向 上一篇重点从对现实世界建模的角度探讨了“本体”在数字化架构中的核心意义。这里借Palantir的“本体”概念、解析Palantir只是起点,目标旨在以他山之石攻玉——探索数字世界的底层架构逻辑,最终为构建自主体系提供思考。Palantir以“本体论”为核心的建模方案是否代表终极答案,不宜过早下结论,但其思路值得深入剖析。 阅读详情

相关推荐

【算力网络】算力知识

尽管算力这个词在近年来很“火”,但其背后的含义,却很少有人真正了解

qq_42809645的博客 1万+

C++高性能PDF解析实战:从库选型到工程优化

PDF解析是处理数字文档数据提取、内容分析和自动化流程的核心技术。其原理在于解析PDF的文件结构,包括文件头、交叉引用表、页面树和内容流,并处理字体编码(特别是CID字体和/ToUnicode映射)以准确还原文本。这项技术的价值在于将非结构化的PDF“黑盒”转化为机器可读的结构化数据,是实现文档智能化处理的基础。在应用场景上,它支撑着金融风控中的批量发票处理、企业级文档搜索引擎的构建以及嵌入式环境下的资源受限解析。本文聚焦于C++生态,深入对比了Poppler、MuPDF和PDFium等主流库在文本提取准确

weixin_33853827的博客 509

详解Σ-Δ型ADC拓扑结构的基本原理

现在,总环路滤波器的H(f)具有更大的滚降,Mod 2型的噪声传递函数具有40 dB/十倍频程的上升速率。同样,当正弦波输入为负满量程时,+1和–1之间的转换会减少,输出以–1为主。噪声传递函数是一个高通滤波器函数,提供噪声整形,在DC附近的较低频率,对量化噪声有很强的抑制。H(f)是环路滤波器的函数,定义噪声和信号的传递函数。Σ-Δ型ADC的噪底由热噪声决定,而不受量化噪声的限制。量化噪声为量化器的输入与输出之差。图5. Mod 1 Σ-Δ环路的线性模型(b),包括方程、滤波器、信号和噪声传递函数图。

qq_43416206的博客 1810

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 297

深入解析璞致PZ-ZU47DR RFSoC核心板:硬件架构与多通道ADC/DAC设计实战

本文深入解析璞致PZ-ZU47DR RFSoC核心板的硬件架构与多通道ADC/DAC设计实战。作为Xilinx Zynq UltraScale+ RFSoC系列的代表产品,PZ-ZU47DR集成了8通道5GSPS ADC和8通道9.85GSPS DAC,支持直接射频采样,大幅简化射频链路设计。文章详细介绍了其技术优势、设计挑战及实战技巧,为5G小基站、毫米波等应用场景提供高效解决方案。

meat5的博客 842

双系统下 ubuntu 20.04 突然 开机黑屏报错 hdaudioC0D2: unable to configure disabling

今天在开实验室开双系统台式机时,ubuntu 20.04 系统下,突然在某次关机后再开机时,本来启动好好的,但是在进行图形化启动时,本来应该是显示输入账号和密码时,直接黑屏报错了,内容为 hdaudioC0D2: unable to configure disabling ,这里是记录了报错的解决全过程

qq_48717745的博客 991

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 308

别再只做游戏了!用虚幻引擎5(UE5)给你的工厂车间做个数字双胞胎(附数据对接教程)

本文详细介绍了如何利用虚幻引擎5(UE5)构建工业数字孪生系统,实现工厂车间的智能可视化。通过UE5的高质量渲染和实时数据处理能力,结合OPC UA和MQTT协议,打造高效的数据对接方案,提升异常识别和设备管理效率。文章还分享了模型优化、可视化设计及典型工业场景的实战案例,助力企业迈向工业4.0。

weixin_33738555的博客 206

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 328

YOLOv13添加WDBB模块,map提升5.34!!,召回率提升6.55,准确率提升3.23

本文提出了一种基于YOLOv13改进的目标检测模型,通过引入WDBB模块显著提升了检测性能。实验结果表明,添加WDBB模块后,mAP提升11.34,召回率提升14.55,准确率提升3.23。文章详细介绍了模型移植方法,包括创建新的yaml配置文件、修改tasks.py和__init__.py文件,以及实现rep_block.py中的核心转换函数。改进后的模型通过深度卷积、通道注意力等模块优化了特征提取能力,同时保持了轻量化的特点。该工作为YOLO系列模型的性能提升提供了新的思路和技术实现。

FJN110的博客 2624

AutosarMCAL开发——基于TC3x系列时钟系统浅析

本文为博主个人学习总结记录,如有不正,欢迎指正。

qq_45583706的博客 889

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 601

2024 全国大学生新质生产力大赛 B:金融违规交易的大数据分析 问题四思路代码

问题四:请分析附件中所有的指标数据,选取合适的指标,建立“金融违规 洗钱交易的预测模型”,并选取合适的训练集和测试集,计算预测模型的准确率。 为了提前识别并预测金融违规洗钱的交易事件,请基于你们团队数据分析的结果, 分别给公安部门和银行机构提出你们的建议。

YOLO 376

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 144

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 23

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 359

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 417

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 173

【MPC 算法】Python 实战:模型预测控制(MPC)算法原理与代码实现

本文介绍模型预测控制(MPC)原理与Python实现。MPC通过滚动优化预测未来状态,结合系统模型、目标函数与约束条件,动态生成最优控制序列。以一阶温度系统为例,使用CVXPY构建凸优化问题,实现加热功率的智能调控。代码包含模型预测、目标函数设计(含温度跟踪与控制平滑惩罚)、输入约束及滚动更新机制。仿真结果表明,MPC能快速稳定温度至目标值60℃,且控制动作平滑合理,体现其在复杂系统中的优越性。

赖德发的博客 39

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 221

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 180

【前缀和+复合离散化】题解:双色矩形(two)_数据结构_算法优化_预处理_二维前缀和_STL_C++算法竞赛

给定一个 $n \times n$ 的黑白棋盘,初始按 $i+j$ 奇偶染色,经 $k$ 个格子颜色翻转后,求子矩形中黑白格子数差的绝对值最大值。由于 $n$ 可达 $10^9$,但 $k \leq 50$,可离散化关键点。枚举所有由修改点构成的矩形及其四边向外扩展(共 $16$ 种扩展方式),利用二维前缀和快速计算变化量,结合奇偶性判断多出的格子颜色,最终取最大绝对差。时间复杂度为 $O(k^4)$,在 $k \leq 50$ 下可行。

YLCHUP的博客 199

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 371

算法62&&63,存在重复元素

判断整数数组中是否有任意元素出现至少两次。:判断数组中是否存在两个。,且索引差值的绝对值。

sheshibenniaodan的博客 78

商业综合体公摊电费分摊算法:512 商户双层权重与尾差实测

公摊电费分摊算法是指把公共回路电量按公示权重拆到每户的规则化计算过程,核心不是权重多精巧,而是每张账单都能被租户手算复现。某珠三角商业综合体 512 户商户实测:固定费与变动费按 4:6 加权,尾差用余数递补压到 0.01 千瓦时精度,24 个月 12288 张账单重算差异为零,月度争议从 31 起降到 2 起。适用边界:商铺与租户已独立装表、公共回路已分项计量的商业综合体适用;末端未装表、靠总表减合计倒推公摊的场景不适用,先把表补齐再谈分摊。

149

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 401
上一篇: 使用soci库时,出现“#error “SOCI must be configured with C++11 support when using C++11“”的解决办法
下一篇: Datawhale AI 夏令营-task1
ghost_him
博客等级 码龄6年 598粉丝 90原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值