Web Analytics
yangyang

码农兼一个普普通通小青年

Data Structures and Algorithms


基于BFS算法的停车场出库问题求解与实现

本文以益智游戏《停车场出库(Car Park Puzzle)》为应用背景,针对其车辆调度与最短路径求解问题,展开广度优先搜索(BFS)算法的实践研究。该游戏借鉴华容道机制,要求在网格场地内按车辆方向约束移动车辆,将目标车辆引导至出口,中高难度关卡人工求解效率较低。文章在上一篇迷宫寻路算法的基础上,对比分析了传统迷宫 BFS 与停车场状态空间 BFS 的差异,详细阐述了从单点坐标搜索到全局局面状态搜索的算法升级思路。项目使用 C++ 结合 Qt 框架实现完整游戏系统,采用 CMake 构建,运行于 Windows+Visual Studio 环境。内容涵盖停车场网格与车辆的数据结构建模、游戏状态编码与去重策略、BFS 最优解搜索核心流程、最小步数证明、Qt 界面绘制、鼠标拖拽与键盘交互逻辑设计,并增加了搜索状态计数功能以评估算法效率。 …

Qt BFS Shortest Path Parking Lot Puzzle State Space Search Game Algorithm

迷宫与网格寻路:四种经典算法对比

本文介绍了DFS、BFS、Dijkstra 与 A * 这四类经典的图与网格搜索算法。DFS采用深度优先、碰壁回溯的思路,借助栈实现,空间开销小,但不保证最短路径,适合只需找到任意可行路径的场景。BFS以队列逐层扩展,能在无权图中得到最短路径,属于盲目搜索,扩展范围较大。Dijkstra使用优先队列,可处理带权路径,能找到全局最小代价路线,但同样盲目扩展,在大网格中效率偏低。A*在 Dijkstra 基础上引入启发函数,结合已走代价与预估剩余距离,有方向地搜索,在满足可采纳性时可得到最优解,效率显著更高,是游戏导航、路径规划等场景的主流选择。整体上,四者从盲目到启发、从简单到高效,覆盖了从可行路径到最优带权路径的不同需求。 …

Dijkstra DFS BFS A Star Pathfinding

订单簿重建引擎的架构演进与性能优化

在构建低延迟交易系统时,全速盘口(OrderBook)的实时重建是数据处理链路中计算密度最高、对延迟最敏感的环节之一。本文将详细阐述 FastMarketDataManager 组件的演进历程,分析从单线程模型到静态分片,再到基于消息队列的动态负载均衡架构的技术决策过程,重点介绍如何在保证数据严格时序的前提下,摒弃了传统的加锁同步方案,转而利用消息队列的 FIFO 特性,设计了基于控制指令(Command Pattern)的异步迁移流程,解决热点股票引发的队头阻塞(Head-of-Line Blocking)问题。 …

OrderBook tas marketdata orderbook reconstruction

实现一个TCP中继器

在之前实现端口转发的几种方法这篇文章中,介绍了三种实现端口转发的方法,本质就是建立一个TCP中继: tcpReplay.jpg  TCP中继 但要完整实现一个TCP转发或者代理(Tcp Relay),还是有很多细节需要考虑。在《Linux多线程服务端编程:使用muduo C++网络库》这本书中,作者提到了以下需要考虑的问题: 建立连接。TCPRelay在接受client的连接C之后才向server发起连接S,那么在S建立之前,从C收到的数据如何处理?要不要暂存起来? 并发连接的管理。上图中只画了一个client,实际上TcpRelay可以服务多个client,这两边的并发连接如何管理,如何防止串话(cross talk?) 连接断开。client和server都可能主动断开连接。当client主动断开连接C时,TcpRelay应该立刻断开S。当server主动断开连接S时, …

tcp forward TCPIP

浅谈环形队列数据结构

环形队列(Circular Queue),也被称为环形缓冲区(Circular Buffer)或环状缓冲区(Ring Buffer)。这是一个在高性能计算、底层驱动和实时系统中极为重要和常见的数据结构。环形队列有很多应用,比如音视频处理中的平滑地处理数据流,防止卡顿;操作系统内核中的I/O缓冲区、管道(Pipe)的实现;网络通信中用于收发网络数据包的缓冲区;以及使用内存映射文件进行进程间通讯时,使用环形缓冲区能够减少锁占用。 …

Circular Queue Ring Buffer

.NET常用数据结构及复杂度

在.NET中的基础类库(Basic Class Liberary,BCL)中有一些基本的数据类型比如Stack、List、Dictionary、LinkList等等,这些类型虽然看上去五花八门,但是其内部的实现所使用的数据结构无外乎是那些经典的结构比如数组、链表、哈希表、树等。了解这些类型背后的结构就能很清楚的知道对应数据类型的插入、查找、删除的时间和空间复杂度。在应用开发中可以根据具体的使用场景,选择合适的、高效的数据结构可以提高应用程序的效率。本文试图通过源码来查看这些基本类型的内部实现方式。 …

Priority Queue quaternary min-heap

使用treemap图来显示沪深300指数热点图

前几天看到一篇新闻里做的下面这张股票热点图,单纯的觉得这个图很好看,于是研究了一下如何自己绘制这个图,后来发现这种类型的图还有个专有的名字,叫treemap图。本文先介绍什么是treemap图,然后展示如何使用C#来生成沪深300指数的treemap。 …

treemap HS300 squarified

DataGridView绑定到DataTable和BindingList的分析与比较

本文介绍了使用DataGridView绑定数据的两种方法,一种是直接将其DataSource属性绑定到DataTable的DefaultView,绑定后它默认支持排序,筛选等高级功能,另外当DataTable值发生变化时DataGridView也会自动刷新,它的缺点是DataTable结构过于重,而且对于单元格赋相同的值时,仍然会触发事件导致界面刷新,这在有些场景下会影响效率。另外一种方法是DataGridView绑定BindingList实体,它的有点是能够进行更多的精细控制,并且效率会更高,缺点是内置的BindingList对象并没有实现排序,筛选等功能。针对BindingList的缺点,本文介绍了BindingListView这个第三方的库,它完美解决了BindingList默认不支持排序和筛选,且要实现筛选筛选功能单一的问题。 …

DataTable DataGridView BindingList BindingListView DataBinding

一种实时监控日志文件变更并读取变更内容的方法

本文介绍了一种监控日志文件变化,并读取变动内容的方法。通过使用FileSystemWatcher类,可以监控文件变化,并通过回调事件触发通知。为了避免文件频繁变动导致频繁的文件读写,这里使用了一个定时器来定时读取。当文件距离上一次读取发生变化时就读取。在读取文件的时候,由于涉及到多进程读写同一个文件,所以这里创建了FileStream并通过指定FileShare参数,而不是直接创建StreamReader来解决了读写冲突导致日志文件丢失的问题。在解决这一问题的过程中,还分析了long4net源码中RollingFileAppender写入文件时的FileShare参数以及StreamReader源码中,如果直接指定path时FileStream的参数。 …

RollingFileAppender log4net FileShare FileSystemWatcher

Aho-Corasick多模式匹配算法

aho-corasick-automation简称AC自动机算法,它是一个经典的多模式匹配算法,它借鉴了KMP算法的思想,可以由有限状态机来表示。具体实现中可以通过构建状态转移函数,失配函数,结果输出函数来实现。用于匹配的FSA跟输入的字符串无关,只跟模式串有关。匹配中如果发生失败,则FSA回退到某一状态,而输入的字符串则无须回退,从而能够实现通过一次遍历给定的字符串来查找所有的关键字匹配。 …

aho-corasick pattern-match automation kmp