数据结构与算法
文章平均质量分 67
AI高工
程序员,AI工程师,分享人工智能、机器学习、大模型、软件工程、游戏开发、网络、云计算
展开
-
python元类与C#、Java中的反射
Python的元类和C#中的反射在概念上有一定的相似性,但它们的目的和使用方式有所不同。Python的元类:C#中的反射:相似之处:不同之处:总的来说,虽然Python的元类和C#中的反射在概念上有一定的相似性,但它们解决的问题和使用方式有所不同。元类是Python中一种强大的特性,但应该谨慎使用;反射是C#中一个实用的工具,广泛应用于各种编程场景。理解它们的区别和适用场景,可以帮助你更好地利用这些特性来解决实际问题。原创 2024-05-11 22:09:07 · 323 阅读 · 1 评论 -
编程教学语言的选择
我赞成的编程教育过程,应当是以C/C++(基本上是C)为主线,贯穿起算法、数据结构、系统原理、编译和数据处理、软件设计和组件技术等关键知识领域,让学生能够从根本上理解现代软件系统的原理和构造,并通过有效的练习建立正确的软件设计观念和良好的工程实践习惯。在这个基础上,无论将来是深入学习C++,还是进入Java的繁荣世界,或者拥抱Python、Ruby,甚至于走向Web开发,都会心领神会,势如破竹。原创 2023-02-07 14:29:24 · 693 阅读 · 0 评论 -
如何快速上手一门新语言
在现代编程环境下,这个问题是涉及开发思想的一个核心问题,几乎每种语言在这里都会用足功夫,.NET的delegate,Java的anonymous inner class,Java 7的closure,C++OX的 tr1::function/bind,五花八门。经过这么多年,我已经能够相信,三种流程控制结构加简单的类型机制,已经能将一切现实问题的解法映射给计算机,学再多的语言,再多的语言机制,不过学到了更多的映射手段,代码结构方面的东西,真正要解结的问题呢,反而被模糊了,对语言的学习应适可而止。原创 2023-02-07 10:05:57 · 340 阅读 · 0 评论 -
机器视觉中的摄像机标定和自标定分析
所谓主动视觉系统,是指摄像机被固定在一个可以精确控制的平台上,且平台的参数可以从计算机精确读出,只需控制摄像机作特殊的运动来获得多幅图像,然后 利用图像和已知的摄像机运动参数来确定摄像机的内外参数。但在输入多幅图像并能得到一致射影重建的情况下,基于二次曲面的自标定方法会更好一些,其根源在于二次曲面包含了无穷远平面和绝对二次曲线的所有 信息,且基于二次曲面的自标定方法又是在对所有图像做射影重建的基础上计算二次曲面的,因此,该方法保证了无穷远平面对所有图像的一致性。传统的摄像机标定需要标定参照物。原创 2023-02-02 16:41:40 · 2219 阅读 · 0 评论 -
C# 装箱和拆箱
C#语言中的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对象。值类型包括(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct),装箱 和拆箱 是C#类型系统的核心概念,通过装箱和拆箱操作,可以轻松的实现值类型与引用类型的互相转换。拆箱就是将一个引用型对象转换成任意值型!原创 2023-01-13 17:38:09 · 2697 阅读 · 0 评论 -
图解卡尔曼滤波(Kalman Filter)
首先援引来自知乎大神的解释。“一位专业课的教授给我们上课的时候,曾谈到:filtering is weighting(滤波即加权)。滤波的作用就是给不同的信号分量不同的权重。最简单的loss pass filter, 就是直接把低频的信号给1权重,而给高频部分0权重。对于更复杂的滤波,比如维纳滤波, 则要根据信号的统计知识来设计权重。从统计信号处理的角度,降噪可以看成滤波的一种。降噪的目的在于突出信号本身而抑制噪声影响。从这个角度,降噪就是给信号一个高的权重而给噪声一个低的权重。维纳滤波就是一个典型的降噪滤原创 2023-01-12 10:18:19 · 1797 阅读 · 0 评论 -
线性拟合问题的多种解法
相信大家都做过线性拟合问题吧,其实就是给很多点,来求线性方程的斜率和截距。早在高中数学就有这类问题,我记得很清楚,如果出现在试卷中,一般出现在解答题的第二题左右,高中中的做法就是最小二乘法,代入公式,求斜率和截距,说句好听,就是送分题。在科学计算中,也是采用ols(普通最小二乘法)进行回归分析。原文链接:https://blog.csdn.net/weixin_44510615/article/details/105271700。这个就是三大深度学习框架的入门demo。原创 2022-10-25 12:11:54 · 359 阅读 · 0 评论 -
创造其它语言的语言 - Lisp
实际上,我们的JSON数组语言是由JavaScript实现的,两者是融为一体的,想对JSON数组语言增加语法,必须要写对应的JavaScript代码。但是对Lisp来说,它的代码本身就是数据,此外Lisp还支持宏(macro),宏可以直接把列表当做数据来操作,从而生成新代码,不需要其他语言的介入。你可以想象,你可以和语言设计者站在同一个层次去增强一门语言,把那个语言变成一个属于你所在业务领域的语言,然后用新语言去编程,那编程速度得有多快!如果我们想用操作数据一样来操作代码, 答案就是:把代码变成数据。转载 2022-10-17 23:18:57 · 391 阅读 · 0 评论 -
让你告别996的项目维护方式
一篇《程序员技术写作指南》,关于如何正确写代码注释、写PR描述等等。这些东西虽然都是小事儿,但如果大家都不规范,代码维护起来有多痛苦?原创 2022-07-17 07:27:27 · 201 阅读 · 0 评论 -
内存溢出与内存泄漏
内存溢出是什么情况?内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序.原创 2022-05-15 13:15:44 · 368 阅读 · 0 评论 -
多线程、异步导致的时序逻辑Bug
在实际开发程序的过程中,经常会遇到一些由于时序的先后顺序,导致产生一些奇奇怪怪的问题,很多是由于多线程、异步等导致的时序逻辑Bug, 比如:消息A先到达,消息B后到达,消息A处理完成后,再处理消息B,程序就正常运行(即达到我们我们预想的结果);然而如果消息A没有处理完,就开始处理消息B,程序可能会出现我们不期望的结果。 为了避免上面问题的出现,我们可以采取将同一类消息按先后到达顺序放在同一个队列中,然后有同一个线程来处理,这样就能保证按照时序处理。...原创 2022-03-11 09:41:21 · 1150 阅读 · 0 评论 -
IEnumerator , IEnumerable 枚举器接口
IEnumerator是枚举器的意思,IEnumerable是可枚举的意思。这两个都是个接口foreach是一种语法糖,用来简化对可枚举元素的遍历代码。而被遍历的类通过实现IEnumerable接口和一个相关的IEnumerator枚举器来实现遍历功能。public class MyList : IEnumerable{ public int[] _data = new int[10] { 1, 5, 7, 9, 7, 8, 7, 8, 7, 4 }; public int原创 2022-02-17 10:30:11 · 571 阅读 · 0 评论 -
游戏开发与设计中的“3C”是指什么?
游戏开发与设计中的“3C”是指什么?https://mp.weixin.qq.com/s?__biz=MzkzNTIxMjMyNg==&mid=2247492980原创 2022-01-30 15:37:26 · 2595 阅读 · 0 评论 -
C# 单例和静态类
单例与静态类的相同作用1.单例与静态类只能拥有一个实例,该实例在应用程序的整个周期中用于保持应用程序的全局状态。2.单例和静态类都可以实现线程安全。单例与静态类的区别?需要记住的是, 静态是属于C#中的一种语言功能, 而单例是一种设计模式。所以两者属于不同的领域。1.无法创建静态类的实例, 但是可以创建单个类的实例, 然后重用。2.编译器编译静态类, 在内部静态类视为抽象和密封类。3.单例的构造函数始终标记私有, 我们无法从单例类外部创建实例。4.静态类是在应用程序第一次加载进行初..原创 2022-01-30 15:25:37 · 1155 阅读 · 0 评论 -
Unity中多种单例模式的实现方式
两大类,一类是普通C# 类 的单例,二类是继承Mono的单例普通C#类:1. 普通类的单例懒汉式(首次调用的时候才实例化,非线程安全) public class GameManager { private static GameManager instance; //单例对象,全局唯一 public static GameManager GetInstance //获取接口,也可以写成函数形式 {原创 2022-01-30 15:18:25 · 3733 阅读 · 0 评论 -
关于“空”string字符串
string a = "";string b = "";string c = string.Empty;string d = string.Empty;string e = null;string f = null;等运行完后在即时窗口中用&命令查看这些变量的地址然后发现,所有变量的栈地址都不同(废话),赋值null的未分配堆空间,所以无堆地址,其他无论赋值""还是赋值string.Empty堆地址都完全一样。最终结论:赋值null不会分配堆空间,赋值""和stri.原创 2022-01-30 12:18:49 · 1104 阅读 · 0 评论 -
《图解 C# 教程 第 5 版》与性能优化
《图解 C# 教程 第5版》与性能优化 | 萤火之森原创 2021-12-02 23:02:45 · 1755 阅读 · 0 评论 -
C#遍历List并删除某个或者几个元素的方法
private void ListTest() { List<int> replyList = new List<int>() {4, 5}; List<int> origialList = new List<int>() {1, 4, 5, 6}; foreach (var reply in replyList) { for (int j = orig...原创 2021-11-09 16:31:18 · 5412 阅读 · 0 评论 -
正余弦转化之诱导公式:“奇变偶不变、符号看象限”
1.正余弦转化首先看看,正弦、余弦在各个象限中的正负情况,如下图1所示。图1.sinx、cosx在各个象限中的正负号示意图在图1中,左图表示sinx,右图表示cosx。首先看看坐标轴上数字是如何来的!当x轴正半轴沿逆时针方向,旋转90度时,与y轴正半轴重合,旋转180度时,与x轴负半轴重合,旋转270度时,与y轴负半轴重合……坐标轴上的数字由此而来。对于正弦函数sinx来说,当x位于第一、二象限时,为正;当x位于第三、四象限时为负。对于余弦函数来说,当x位于第一、四象限时,为正;当x位于原创 2021-10-28 09:11:41 · 25519 阅读 · 10 评论 -
Caucher Birkar教授:数学之美
7月24日,菲尔兹奖得主、刚入职清华的Caucher Birkar教授为丘成桐中学生数学夏令营做题为"数学之美”的讲座。讲稿经整理并由Caucher Birkar博士后曲三太加以修正,特此刊出,与数学爱好者分享。这是一篇值得打印出来,放在案头,细细品读的文章。I'm proud to be in China and teach Chinese students because I think education is something universal and teaching in China原创 2021-10-13 08:21:30 · 842 阅读 · 0 评论 -
C# 语法糖(Syntactic sugar)
定义语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。它可以使程序员更加容易去使用这门语言:操作可以变得更加清晰、方便,或者更加符合程序员的编程习惯。简而言之,语法糖就是一种便捷写法。1. 自动属性未简化:手写私有变量+公有属性private string _name;public string Name{原创 2021-10-12 20:03:47 · 5802 阅读 · 0 评论 -
C#OverflowException异常
1.前言 某日,在调试程序时,运行到“ntemp = Convert.ToInt32(UpNumber.Text, 16);”这句时突然蹦出一个对话框报告“OverflowException”。抓图如下:2.分析原因 查看UpNumber.Text的值为“11111111111111111111111111”,而Int32的取值范围是[-2147483648, 2147483647],用十六进制表示是[0x80000000,0x7FFFFFFF]而字符串“1111111111111111原创 2021-10-11 16:20:51 · 3665 阅读 · 0 评论 -
帧同步与状态同步:方案比较
状态同步:大型的MMOARPG ,比如魔兽世界帧同步:网络条件好的局域网,比如魔兽争霸,优化过的MMRPG, 比如王者荣耀农药自从上线以来,依靠着强大的产品力以及腾讯的运营能力,在游戏市场上表现可谓是风生水起,根据第三方的调研数据显示,《王者荣耀》渗透率达到22.3%,用户规模达到2.01亿人,每日的日活跃用户(DAU)均值为5412.8万人。 如此可观的数据,令人十分钦佩。当然了,作为技术人,更愿意从技术上了解去一些王者荣耀的实现原理和架构方式,从中找到新的知识领域,扩展自己的知识边界,丰原创 2021-08-16 08:47:46 · 1830 阅读 · 0 评论 -
AOI:实现原理
1 AOI简介AOI的全称叫Area Of Interest,感兴趣的区域。这个技术可以看做是服务器广播的一种。在MMO类型的游戏里是必须存在的。MMO类型的游戏都会有野外和主城场景,一般来说,服务器只会同步你周边多少半径以内的玩家给你,太远的一是玩家屏幕看不到没有意义,二是同步太多的玩家对于服务器压力成倍数上涨。想象一下,如果一个区域内有100个人,这些人可能都在不停的走路,如果是广播形式的话,那每一个人移动都要向另外的100个人进行位置同步。假如服务器每50ms同步一次玩家位置,那么服务器处原创 2021-08-16 08:36:26 · 1245 阅读 · 0 评论 -
避免getter/setter 中的那些糟糕设计
不!!!!不要点击生成 getter 和 setter 选项!!!我喜欢这条规则:“不要使用访问器和修改器。”像任何好的规则一样,这条规则注定要被打破。但当?首先,让我清楚我在说什么:在考虑了一系列更好的替代方案之后,向 OO 类添加 getter 和 setter 应该是最后的手段。我相信仔细分析得出的结论是,在大多数情况下,getter 和 setter 是有害的。有什么危害?首先让我指出,我所说的“伤害”可能根本没有任何伤害。在某些情况下,以下是一个完全合理的类:...原创 2021-08-06 11:07:59 · 575 阅读 · 0 评论 -
45组数学动画
“要是早看到这些图,数学也不会那么差了!一提到数学,可能很多人都会觉得非常头疼。。。面对一个个由数字字母构成的抽象函数,复杂公式,真是分分钟懵逼到变形。。。要是那些复杂的数学公式和原理都能像动画那样生动有趣,简洁明了那该多好!咳咳。。。没错,Janthy君就整理了45组数学动画,让那些费解的数学原理和公式全都动起来,让数学不再枯燥!(按简单到复杂排序~) 1 三角形内角和为180º 2 多边形外角和为360º (这张图片来源于可乐学.原创 2021-08-05 09:52:19 · 1108 阅读 · 0 评论 -
数学里的 e 为什么叫做自然底数?
这个数字的存在其实是很「自然」的一件事情……1 / 多少妃子得不到皇帝的宠幸?首先,不扯任何公式,更不扯极限的概念,让我们穿越回古代,看一个在当时应该是很「自然」的事情:皇帝宠幸妃子。问题很简单:假设皇帝在宫中一共有1000位妃子,每天完全随机地抽选一位妃子来宠幸,之后妃子安然无恙地回去,如此以往重复大概3年(1000天),那么,最终有多少位妃子能够得到宠幸、又有多少得不到宠幸呢?答案是:如果每一天确实都完全随机地选妃子,那么1000位妃子里面,最终将会有大约632位被选中过,而..原创 2021-08-02 08:30:24 · 633 阅读 · 0 评论 -
自顶向下与自底向上编程思想的对比
在国内的网站上搜索什么叫“自底向上”编程,给人的感受似乎是同一个问题有两种解决思路,一个是“自顶向下”,一个是“自底向上”。但你仔细看那些文章的讲解,其实说的都只是“自顶向下”。为了说清楚“自底向上”编程,首先赘述一下什么叫做“自顶向下”编程。自顶向下编程自顶向下编程一般会好理解一点。首先从整体分析一个比较复杂的大问题。为了解决这一问题,必须把它拆分来看,应当解决哪几个小问题,然后再逐步细分到更小的问题,直到每个问题对我们来说,都已经很简单。解决了所有的小问题,逐步向上汇总,就完成了最初的复杂.原创 2021-07-29 15:39:37 · 4698 阅读 · 2 评论 -
OD逆向一个简单的工程实战
今天闲着没事干,找朋友要了一款简单的登录软件用来写这篇基础入门文章,这篇文章算是最基础的一个逆向工程的实战演示。软件逆向工程(Software Reverse Engineering)又称软件反向工程,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。通常,人们把对软件进行反向分析的整个过程统称为软件逆向工程,把在这个过程中所采用的技术都统称为..原创 2021-07-09 11:17:59 · 1386 阅读 · 1 评论 -
程序设计原则之Tell, Don’t Ask原则
代码中,我看到的最多被违反的原则是“命令,不要去询问(Tell, Don’t Ask)”原则。这个原则讲的是,一个对象应该命令其它对象该做什么,而不是去查询其它对象的状态来决定做什么(查询其它对象的状态来决定做什么也被称作‘功能嫉妒(Feature Envy)’)。在面向对象的编程中,一个对象被定义成由对象状态和操作这个状态的方法组成。在《Holub on Patterns: Learning Design Patterns By Looking At Code》这本书里,Allen Holub在第一章原创 2021-06-07 10:04:27 · 1354 阅读 · 0 评论 -
程序设计原则之SOLID原则
设计模式中的SOLID原则,分别是单一原则、开闭原则、里氏替换原则、接口隔离原则、依赖倒置原则。前辈们总结出来的,遵循五大原则可以使程序解决紧耦合,更加健壮。SRP 单一责任原则 OCP 开放封闭原则 LSP 里氏替换原则 ISP 接口隔离原则 DIP 依赖倒置原则 单一责任原则指的是一个类或者一个方法只做一件事。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化就可能抑制或者削弱这个类完成其他职责的能力。例如餐厅服务员负责把...原创 2021-06-07 10:02:06 · 8685 阅读 · 0 评论 -
OOP有什么弊端
作者:田乐链接:https://www.zhihu.com/question/20275578/answer/27073776来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。OO 一方面是一个过载的概念(包含了很多广义的最佳实践),另一方面 OO 又被很多误解所包围。从我个人经历的角度,这些地方值得注意。OO 是一个与时俱进的概念,我们不能绝对的讨论最早提出 OO 理论的人所谈论的那个 OO。我们还要讨论后来对 OO 阐述的不同角度,或者说 OO 的不同流派。我比较原创 2021-06-05 18:29:46 · 626 阅读 · 0 评论 -
面向对象程序设计
1.面向对象是相对于面向过程的,比如你要充话费,你会想,可以下个支付宝,然后绑定银行卡,然后在淘宝上买卡,自己冲,这种种过程。但是对于你女朋友就不一样了,她是面向“对象”的,她会想,谁会充话费呢?当然是你了,她就给你电话,然后你把之前的做了一遍,然后她收到到帐的短信,说了句,亲爱的。这就是面向对象!女的思维大部分是面向“对象”的!她不关心处理的细节,只关心谁可以,和结果!2....原创 2021-06-04 13:34:09 · 6734 阅读 · 4 评论 -
C#字典Dictionary排序(顺序、倒序)
这里是针对.NET版本过低的排序方式,没怎么用过,记录一下;一、创建字典Dictionary 对象 假如 Dictionary 中保存的是一个网站页面流量,key 是网页名称,值value对应的是网页被访问的次数,由于网页的访问次要不断的统计,所以不能用int作为 key,只能用网页名称,创建 Dictionary 对象及添加数据代码如下:Dictionary<string, int> dic = new Dictionary<string, int&...原创 2021-05-16 18:58:37 · 13772 阅读 · 1 评论 -
什么是值类型,什么是引用类型
概念:值类型直接存储其值,而引用类型存储对其值的引用。部署:托管堆上部署了所有引用类型。引用类型:基类为Objcet值类型:均隐式派生自System.ValueType: 值类型: byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。 引用类型: string 和 class统称为引用类型。 值类型变量声明后,...原创 2021-05-12 20:02:12 · 8664 阅读 · 0 评论 -
IoC, DI, SL, DIP 依赖注入,控制反转
化简为繁把人绕晕版:首先得先说清几个名词 IoC, DI, SL, DIP。IoC(控制反转)目前比较流行的两种方式 DI(依赖注入模式) 和 SL(服务器定位模式),DI 是遵循 DIP(依赖反转原则)的,SL 是 anti-pattern(反模式)的,不遵循 DIP。因为注入的形式五花八门,为了代码复用性和扩展性出现了 IoC container 这么个东西,它是遵循各自 DI/SL 模式实现的容器,DI 容器会大量的运用反射机制来实现。提到的 Laravel 中 Service .原创 2021-05-06 09:21:26 · 279 阅读 · 0 评论 -
时间复杂度和空间复杂度
数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是算法一个非常重要的考量指标。那如何来衡量你编写的算法代码的执行效率呢?这里就要用到我们今天要讲的内容:时间、空间复杂度分析。为什么需要复杂度分析?首先,我可以肯定地说,你这种评估算法执行效率的方法是正确的。很多数据结构和算法书籍还给这种方法起了一个名字,叫事后统计法。但是,这种统计方法有非常大的局限性。 测试结果非常依赖测试环境 测试环境中硬件的不同会对测试结果有很大的影响...原创 2021-04-30 17:46:59 · 946 阅读 · 1 评论 -
FFT(快速傅里叶变换)
https://blog.csdn.net/enjoy_pascal/article/details/81478582https://blog.csdn.net/WADuan2/article/details/79529900原创 2021-04-22 23:29:23 · 205 阅读 · 0 评论 -
Unity 性能优化
常见的Unity性能问题Unity性能问题VSS:Virtual Set Size,虚拟耗用内存。它是一个进程能访问的所有内存空间地址的大小。这个大小包含了 一些没有驻留在RAM中的内存,就像mallocs已经被分配,但还没有写入。VSS很少用来测量程序的实际使 用内存。RSS:Resident Set Size,实际使用物理内存。RSS是一个进程在RAM中实际持有的内存大小。RSS可能会 产生误导,因为它包含了所有该进程使用的共享库所占用的内存,一个被加载到内存中的共享库可能有很 多进程.原创 2021-01-19 20:29:58 · 478 阅读 · 0 评论 -
C#中的异步和多线程
许多开发人员对异步代码和多线程以及它们的工作原理和使用方法都有错误的认识。在这里,你将了解这两个概念之间的区别,并使用c#实现它们。我:“服务员,这是我第一次来这家餐厅。通常需要4个小时才能拿到食物吗?”服务员:“哦,是的,先生。这家餐厅的厨房里只有一个厨师。”我:“……只有一个厨师吗?”服务员:“是的,先生,我们有好几个厨师,但每次只有一个在厨房工作。”我:“所以其他10个穿着厨师服站在厨房里的人……什么都不做吗?厨房太小了吗?”服务员:“哦,我们的厨房很大,先生。”我:...原创 2021-01-18 08:36:26 · 466 阅读 · 0 评论