<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>yycoding-记录编程点滴</title><description>.NET Developer,前微软最有价值专家(2012-2016)</description><link>https://www.yycoding.xyz/</link><pubDate>Tue, 10 Mar 2026 17:02:12 GMT</pubDate><copyright> ©2011-2026 yycoding.xyz</copyright><generator>Moonglade v12.9.1</generator><language>en-US</language><item><title>订单簿重建引擎的架构演进与性能优化</title><link>https://www.yycoding.xyz/post/2026/1/26/architectural-evolution-and-performance-optimization-of-the-orderbook-reconstruction-engine</link><description>在构建低延迟交易系统时，全速盘口（OrderBook）的实时重建是数据处理链路中计算密度最高、对延迟最敏感的环节之一。本文将详细阐述 FastMarketDataManager 组件的演进历程，分析从单线程模型到静态分片，再到基于消息队列的动态负载均衡架构的技术决策过程，重点介绍如何在保证数据严格时序的前提下，摒弃了传统的加锁同步方案，转而利用消息队列的 FIFO 特性，设计了基于控制指令（Command Pattern）的异步迁移流程，解决热点股票引发的队头阻塞（Head-of-Line Blocking）问题。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><category>Design Patterns</category><guid isPermaLink="false">11327188-83EC-42CC-A01D-764B3C8C5522</guid><pubDate>Mon, 26 Jan 2026 00:13:51 GMT</pubDate></item><item><title>实现一个TCP中继器</title><link>https://www.yycoding.xyz/post/2025/11/5/implement-a-tcp-relay</link><description>在之前实现端口转发的几种方法这篇文章中，介绍了三种实现端口转发的方法，本质就是建立一个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时， …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">C3C60944-4B8B-469C-99B4-05BA8E6F27E2</guid><pubDate>Tue, 04 Nov 2025 19:39:08 GMT</pubDate></item><item><title>浅谈环形队列数据结构</title><link>https://www.yycoding.xyz/post/2025/7/14/a-brief-introduction-of-circular-queue</link><description>环形队列（Circular Queue），也被称为环形缓冲区（Circular Buffer）或环状缓冲区（Ring Buffer）。这是一个在高性能计算、底层驱动和实时系统中极为重要和常见的数据结构。环形队列有很多应用，比如音视频处理中的平滑地处理数据流，防止卡顿；操作系统内核中的I/O缓冲区、管道(Pipe)的实现；网络通信中用于收发网络数据包的缓冲区；以及使用内存映射文件进行进程间通讯时，使用环形缓冲区能够减少锁占用。 …</description><author>xjdx2008@126.com</author><category>Data Structures and Algorithms</category><guid isPermaLink="false">402A399D-14E9-4764-BF7B-802360A83F93</guid><pubDate>Mon, 14 Jul 2025 03:57:35 GMT</pubDate></item><item><title>.NET常用数据结构及复杂度</title><link>https://www.yycoding.xyz/post/2024/10/24/common-data-structures-and-complexities-int-dotnet</link><description>在.NET中的基础类库(Basic Class Liberary，BCL)中有一些基本的数据类型比如Stack、List、Dictionary、LinkList等等，这些类型虽然看上去五花八门，但是其内部的实现所使用的数据结构无外乎是那些经典的结构比如数组、链表、哈希表、树等。了解这些类型背后的结构就能很清楚的知道对应数据类型的插入、查找、删除的时间和空间复杂度。在应用开发中可以根据具体的使用场景，选择合适的、高效的数据结构可以提高应用程序的效率。本文试图通过源码来查看这些基本类型的内部实现方式。 …</description><author>xjdx2008@126.com</author><category>Data Structures and Algorithms</category><guid isPermaLink="false">AAC9824E-AD75-4317-8239-E8A13FEB44A4</guid><pubDate>Thu, 24 Oct 2024 15:12:45 GMT</pubDate></item><item><title>使用treemap图来显示沪深300指数热点图</title><link>https://www.yycoding.xyz/post/2024/9/30/display-hotspot-map-of-hs300-index-using-treemap</link><description>前几天看到一篇新闻里做的下面这张股票热点图，单纯的觉得这个图很好看，于是研究了一下如何自己绘制这个图，后来发现这种类型的图还有个专有的名字，叫treemap图。本文先介绍什么是treemap图，然后展示如何使用C#来生成沪深300指数的treemap。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">FCD0D480-8274-4DEB-8877-57BD94E0B2C0</guid><pubDate>Sun, 29 Sep 2024 22:58:32 GMT</pubDate></item><item><title>DataGridView绑定到DataTable和BindingList的分析与比较</title><link>https://www.yycoding.xyz/post/2024/2/8/analysis-and-comparison-of-datagridview-bound-to-datatable-and-bindinglist</link><description>本文介绍了使用DataGridView绑定数据的两种方法，一种是直接将其DataSource属性绑定到DataTable的DefaultView，绑定后它默认支持排序，筛选等高级功能，另外当DataTable值发生变化时DataGridView也会自动刷新，它的缺点是DataTable结构过于重，而且对于单元格赋相同的值时，仍然会触发事件导致界面刷新，这在有些场景下会影响效率。另外一种方法是DataGridView绑定BindingList实体，它的有点是能够进行更多的精细控制，并且效率会更高，缺点是内置的BindingList对象并没有实现排序，筛选等功能。针对BindingList的缺点，本文介绍了BindingListView这个第三方的库，它完美解决了BindingList默认不支持排序和筛选，且要实现筛选筛选功能单一的问题。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">7995B224-98A4-41C7-BDE3-6C3E2FC2C503</guid><pubDate>Thu, 08 Feb 2024 00:19:37 GMT</pubDate></item><item><title>一种实时监控日志文件变更并读取变更内容的方法</title><link>https://www.yycoding.xyz/post/2024/1/19/method-of-monitor-log-file-changes-and-read-the-changes-content-in-real-time</link><description>本文介绍了一种监控日志文件变化，并读取变动内容的方法。通过使用FileSystemWatcher类，可以监控文件变化，并通过回调事件触发通知。为了避免文件频繁变动导致频繁的文件读写，这里使用了一个定时器来定时读取。当文件距离上一次读取发生变化时就读取。在读取文件的时候，由于涉及到多进程读写同一个文件，所以这里创建了FileStream并通过指定FileShare参数，而不是直接创建StreamReader来解决了读写冲突导致日志文件丢失的问题。在解决这一问题的过程中，还分析了long4net源码中RollingFileAppender写入文件时的FileShare参数以及StreamReader源码中，如果直接指定path时FileStream的参数。 …</description><author>xjdx2008@126.com</author><category>Data Structures and Algorithms</category><guid isPermaLink="false">2DC39242-B673-498E-BD94-D47E8EFB42B4</guid><pubDate>Thu, 18 Jan 2024 23:21:40 GMT</pubDate></item><item><title>Aho-Corasick多模式匹配算法</title><link>https://www.yycoding.xyz/post/2023/10/28/aho-corasick-automation-a-multiple-patterns-matching-algorithem</link><description>aho-corasick-automation简称AC自动机算法，它是一个经典的多模式匹配算法，它借鉴了KMP算法的思想，可以由有限状态机来表示。具体实现中可以通过构建状态转移函数，失配函数，结果输出函数来实现。用于匹配的FSA跟输入的字符串无关，只跟模式串有关。匹配中如果发生失败，则FSA回退到某一状态，而输入的字符串则无须回退，从而能够实现通过一次遍历给定的字符串来查找所有的关键字匹配。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">207EA140-6BDB-41D7-A264-29FC89A66E38</guid><pubDate>Sat, 28 Oct 2023 04:50:23 GMT</pubDate></item><item><title>从Dictionary中key为大小写不敏感的字符串类型说起</title><link>https://www.yycoding.xyz/post/2023/8/30/something-about-case-insensitive-dictionary-with-string-key-type</link><description>本文由一个在Dictionary中使用String作为key，且支持大小写不敏感匹配的例子来说明Dictionary的内部原理。由Key获取hash值是Dictionary实现的关键。在Dictionary声明的时候，可以通过构造函数传递IEqualityComparer参数来指定比较器，通过该对象来获取哈希值。如果不提供这个参数，则会在内部判断Key是否实现了IEquatable泛型接口，如果提供了，则使用该泛型接口中定义的GetHashCode来获取哈希值，否则会根据Key的类型生成一个通用的EqualityComparer，这个通过的EqualityComparer的参数是object类型，所以如果Key的类型为结构体，则必须为其实现IEquatable泛型接口，否则就会产生装箱从而严重影响性能。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">675AD413-0B80-4567-9BE8-3D5933E8D906</guid><pubDate>Wed, 30 Aug 2023 04:09:06 GMT</pubDate></item><item><title>.NET中几种名字包含Dictionary的数据结构</title><link>https://www.yycoding.xyz/post/2023/7/10/several-names-contain-dictionary-data-structures-in-dotnet-core</link><description>在.NET Core的源代码中，除了常用的Dictionary、ConcurrentDictionary之外，还有几种名称包含Dictionary的数据结构，它们是ListDictionary、OrderedDictionary、SortedDictionary、HybirdDictionary和StringDictionary。这些个杂牌Dictionary用得很少，不看源代码可能还不知道😂。表面上看，好像都是Dictionary，但研究发现其内部实现却大不相同。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">B1C1D0F5-CF8B-449E-8033-347BF8F3B98E</guid><pubDate>Sun, 09 Jul 2023 22:10:38 GMT</pubDate></item><item><title>.NET Core中Dictionary的实现</title><link>https://www.yycoding.xyz/post/2023/7/2/details-of-dictionary-source-code-in-dotnet-core</link><description>Dictionary是一种存储键值对的数据结构，可以根据Key快速查找对应的Value，它的内部实现原理其实很简单，在浅谈算法和数据结构: 十一 哈希表这篇文章中有详细介绍，但实际的原理和工程实现可能有所不同，在.NET中有.NET Framework和.NET Core的两个版本，大体相同，但细节上有所区别。这里以.NET Core中的Dictionary源码为例，来说明Dictionary的实现细节。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">7B3CF1BD-EEF5-44E5-A682-7CE51FDCC4F8</guid><pubDate>Sun, 02 Jul 2023 03:17:12 GMT</pubDate></item><item><title>从C++中的迭代器说到左闭合区间</title><link>https://www.yycoding.xyz/post/2023/2/8/iterator-in-c-plus-plus-and-left-inclusive-interval</link><description>和C#中的IEnumerable接口类似，在C++中，遍历标准容器库比如vector、deque、list等，都需要用到迭代器对象(iterator)，根据容器的类型不同以及访问时是否需要读写，迭代器也分为可读写迭代器iterator，只读迭代器const_iterator以及反向迭代器reverse_itertaor。 调用容器类型成员的begin和end方法(或者cbegin,cend,rbegin,rend)方法，这两个方法分别返回指向容器首元素，以及尾元素之后的位置(one past the last element)，简称尾后的迭代器。 这里面有一个容易误解的地方在于，end方法返回的迭代器，从来都不会指向容器的最后一个元素，而是指向最后一个元素之后的元素。如果容器v的第一个和最后一个元素分别记为first和last，那么调用v.begin()和v.end()返回的迭代器范围( …</description><author>xjdx2008@126.com</author><category>C++</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">1B883A40-D5F8-418E-B557-ACF421BE7B1A</guid><pubDate>Tue, 07 Feb 2023 19:14:48 GMT</pubDate></item><item><title>布隆过滤器原理及应用</title><link>https://www.yycoding.xyz/post/2022/12/1/principle-and-application-of-bloom-filter</link><description>布隆过滤器（Bloom Filter）是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数，主要用于判断一个元素是否在一个集合中。与直接存储数据不同，布隆过滤器是通过一系列随机映射函数，将待存储的数据通过映射函数提取特征，然后将这些特征存储到二进制向量对应的二进制位上（类似于前文的Bitmap存储），当查找某个值时，通过随机映射函数，提取特征，然后检查这些特征所在的二进制位上是否都为1，如果都为1，表示该可能存在在集合中，但只要有一个为0，则一定不在集合中。 …</description><author>xjdx2008@126.com</author><category>C++</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">34EE4D68-1506-408E-8147-255E458B6741</guid><pubDate>Wed, 30 Nov 2022 18:19:59 GMT</pubDate></item><item><title>位运算及其应用</title><link>https://www.yycoding.xyz/post/2022/11/27/bitwise-operation-and-its-applications</link><description>位运算符作用于整型对象，并把运算对象看作是二进制位的集合。位运算提供了检查和设置二进制位的功能。通常在编写代码中，相比加减乘除，位运算并不常用，但在有些情况下，位运算有用处。本文首先介绍为位运算的基本概念，然后介绍位运算的应用场景，包括使用Bitmap来存储整型数据，并介绍了在此基础上如何对大量不重复的整型数据进行快速排序，对大量整型数进行去重和快速查找，最后介绍了编程语言对Bitmap思想的实现，包括C++里面的bitset，C#里面的BitArray，并介绍了枚举值中使用位运算的一些例子。 …</description><author>xjdx2008@126.com</author><category>C++</category><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">AB6DD6BB-A447-416A-8C29-5BBCAE385855</guid><pubDate>Sun, 27 Nov 2022 00:40:20 GMT</pubDate></item><item><title>C#中的线程同步构造：用户模式构造和内核模式构造</title><link>https://www.yycoding.xyz/post/2022/11/4/user-mode-and-kernel-mode-primitive-thread-synchronization-constructs-in-c-sharp</link><description>当多个线程同时访问共享数据对象时，就需要线程同步，以保证数据状态不会被破坏。线程同步的通常做法是加“锁”，以保证某一时刻只有拥有这个锁的对象才能够去操作数据。加“锁”能够保证共享数据不会被破坏，但是它增加了代码的复杂性，并且有时候不容易测试和重现。另外“锁”增加了系统开销，会损害系统性能。本文介绍了C#中的基元用户模式构造和基元内核模式构造两类基本类型构造，并详细介绍了在C#中的实现。 …</description><author>xjdx2008@126.com</author><category>Data Structures and Algorithms</category><guid isPermaLink="false">63762168-A017-406F-BBB1-8CA27562CA98</guid><pubDate>Thu, 03 Nov 2022 21:44:43 GMT</pubDate></item><item><title>.NET中的一些无损压缩算法</title><link>https://www.yycoding.xyz/post/2022/9/24/compare-of-some-lossless-compression-algorithm-in-dotnet</link><description>股票的行情这种时序数据类型，数据冗余度和相似度较高，天然适合进行压缩。本文分析了几种无损压缩算法，分别是C#内置的和SharpZipLib的GZip、Zstd、LZ4以及Snappy。在对比这几种算法的压缩率，压缩时间后发现，Zstd具有比较好的压缩率和压缩速度，基本能满足行情数据处理以及传输效率的要求。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">716BA8C1-1C36-42A4-BD1D-11E82A804D2B</guid><pubDate>Sat, 24 Sep 2022 04:15:51 GMT</pubDate></item><item><title>开盘集合竞价算法的原理与实现</title><link>https://www.yycoding.xyz/post/2022/6/9/principle-and-implementation-of-open-call-auction-algorithm</link><description>集合竞价是电子撮合交易中的重要撮合方式，通常用来在开盘或者收盘时产生开盘价或者收盘价，或者对于某些流动性差的产品，通过一段时间集中进行撮合，找出能产生最大成交量的价格的方式，（即市场大多数人认可的价格）防止价格被不小心操纵。
    中国大陆市场中，由于人口众多，流动性几乎从不缺乏，所以从一开始就是采用把集合竞价生成开盘价和连续竞价高效撮合组合在一体的方式。具体上，沪深交易所都是以集合竞价来场开盘价和收盘价，在收盘价上，如果集合竞价不能产生收盘价，则采用最后一分钟加权平均价（上交所最开始的收盘价是使用的1分钟均价，后来改成了也采用集合竞价的方式产生）。本文对沪深交易所的开盘集合竞价算法作了简单论述和实现。 …</description><author>xjdx2008@126.com</author><category>Data Structures and Algorithms</category><guid isPermaLink="false">FB2318C6-11E2-4064-821A-CED74217BAE2</guid><pubDate>Thu, 09 Jun 2022 00:31:11 GMT</pubDate></item><item><title>浅谈算法和数据结构: 十一 哈希表</title><link>https://www.yycoding.xyz/post/2014/10/31/introduce-hashtable</link><description>在前面的系列文章中，依次介绍了基于无序列表的顺序查找，基于有序数组的二分查找，平衡查找树，以及红黑树，下图是他们在平均以及最差情况下的时间复杂度：

可以看到在时间复杂度上，红黑树在平均情况下插入，查找以及删除上都达到了lgN的时间复杂度。
那么有没有查找效率更高的数据结构呢，答案就是本文接下来要介绍了散列表，也叫哈希表(Hash Table)
什么是哈希表

哈希表就是一种以 键-值(key-indexed) 存储数据的结构，我们只要输入待查找的值即key，即可查找到其对应的值。
哈希的思路很简单，如果所有的键都是整数，那么就可以使用一个简单的无序数组来实现：将键作为索引，值即为其对应的值，这样就可以快速访问任意键的值。这是对于简单的键的情况，我们将其扩展到可以处理更加复杂的类型的键。
使用哈希查找有两个步骤:

使用哈希函数将被查找的键转换为数组的索引。在理想的情况 …</description><author>xjdx2008@126.com</author><category>Data Structures and Algorithms</category><guid isPermaLink="false">43E3F78E-F77E-4786-AB98-72BB089F2A7A</guid><pubDate>Thu, 30 Oct 2014 23:02:00 GMT</pubDate></item><item><title>浅谈算法和数据结构: 十二 无向图相关算法基础</title><link>https://www.yycoding.xyz/post/2014/5/8/introduce-undirected-graphs</link><description>从这篇文章开始介绍图相关的算法，这也是Algorithms在线课程第二部分的第一次课程笔记。
图的应用很广泛，也有很多非常有用的算法，当然也有很多待解决的问题，根据性质，图可以分为无向图和有向图。本文先介绍无向图，后文再介绍有向图。
之所以要研究图，是因为图在生活中应用比较广泛：

无向图
图是若干个顶点(Vertices)和边(Edges)相互连接组成的。边仅由两个顶点连接，并且没有方向的图称为无向图。 在研究图之前，有一些定义需要明确，下图中表示了图的一些基本属性的含义，这里就不多说明。
 
图的API 表示
在研究图之前，我们需要选用适当的数据结构来表示图，有时候，我们常被我们的直觉欺骗,如下图，这两个其实是一样的，这其实也是一个研究问题，就是如何判断图的形态。

要用计算机处理图，我们可以抽象出以下的表示图的API：

 
Graph的API的实现可以由多 …</description><author>xjdx2008@126.com</author><category>Data Structures and Algorithms</category><guid isPermaLink="false">D267962F-A391-4C43-9025-D19EBEEEFFA2</guid><pubDate>Wed, 07 May 2014 18:07:00 GMT</pubDate></item><item><title>浅谈算法和数据结构: 十 平衡查找树之B树</title><link>https://www.yycoding.xyz/post/2014/3/29/introduce-b-tree-and-b-plus-tree</link><description>前面讲解了平衡查找树中的2-3树以及其实现红黑树。2-3树种，一个节点最多有2个key，而红黑树则使用染色的方式来标识这两个key。
维基百科对B树的定义为&amp;ldquo;在计算机科学中，B树（B-tree）是一种树状数据结构，它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树，概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同，B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程，从而加快存取速度。普遍运用在数据库和文件系统。&amp;rdquo;
定义

B 树可以看作是对2-3查找树的一种扩展，即他允许每个节点有M-1个子节点。

根节点至少有两个子节点
每个节点有M-1个key，并且以升序排列
位于M-1和M key的子节点的值位于M-1 和M key对 …</description><author>xjdx2008@126.com</author><category>Data Structures and Algorithms</category><guid isPermaLink="false">A0E92F73-C86D-4EB3-BBFD-A6F32634BDC0</guid><pubDate>Fri, 28 Mar 2014 16:51:00 GMT</pubDate></item></channel></rss>