自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 c语言遍历文件夹中的文件

文件目录如下,文件夹里还有一些txt文件未展示出来。使用递归实现,深度优先遍历文件夹中的文件。代码如下,用了一点C++的语法。

2024-02-17 13:30:18 522 1

原创 面向对象三大特性:封装、继承、多态

3.多态:多态一般和继承有关。父类暂时没有图形的具体信息,所以暂时无法实现Area方法,定义为抽象类。需要在子类中实现(重写)父类的Area方法。不管是求什么形状的面积,main函数中永远是通过shape.Area求面积。2.继承:圆形类和三角形类都是从形状类继承而来,父类和子类之间是一般和特殊(a kind of)的关系,圆形是形状的一种,三角形也是形状的一种。1.封装:类里封装了数据和方法,封装实现了信息隐藏,保证了数据安全。设计圆形类和三角形类,求面积。

2024-02-17 13:21:32 345

原创 C语言求解猴子分桃子

问题:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?其实,仔细观察猴子和桃子的个数,可以发现两者之间有一个函数关系,可以直接根据猴子求得桃子个数~_~如果个数再多,int要换成long long。减少循环次数,程序速度还可以优化。

2024-02-11 23:17:16 947

原创 c语言求多边形面积

多边形有现成的面积公式,直接套用即可。area函数接受两个参数:顶点坐标,顶点个数。

2024-02-11 23:05:21 642

原创 结构体数组所有元素(1亿个元素)初始化为相同的值

如果结构体里的成员都是一些简单的基本数据类型,整个结构体才几十个字节,即使有1亿个元素,用for循环赋值,程序执行时间也只要10^8纳秒级别,0.1秒的样子。编译器优化+高速缓存命中,速度已经飞快了,不用操心那么多。多线程加速效果不明显,3个线程以上基本没有加速效果了,猜测是硬件资源的并行度有限(这样说可能不准确),可能是竞争之类的原因导致的,或者是因为总线宽度有限?一个结构体数组,有1亿个元素,每个元素都要初始化为相同的值,如果没有现成的语法直接支持这样的初始化操作,就得用for循环写,会不会非常耗时?

2024-02-10 17:42:56 310

原创 大水仙花数求解

每次递归,“统计”这个数中某个数字(cur_digit)出现的次数,直到0-9十个数字全被统计。不断递归的结果,是:“可用”的数字位数(unused_bit)越来越少,与此同时,这个数(cur_sum)也越来越大。当0到9的个数全部统计结束,这个cur_sum就是这个数本身。(1)11333355和33331155看上去是不一样的两个数,但是它们又一样,因为相同数字出现的次数一样。运行结果,19位水仙花数有4个,用时0.18秒。输入位数,求解水仙花数。暴力求解,位数如果太多,会超时。

2024-02-10 00:59:46 188 1

原创 C++容器的使用,求解“好运留下来,烦恼丢出去”moshu

最后留下的那半张就是之前藏起来的那半张,通过程序把中间的变化过程展示出来。(4)见证奇迹的时候,根据性别不同,如果此刻剩下的牌是6张(刚扔了1张),那么2一定在第5个位置。所以,当移动3张纸牌并插入到中间位置时,第一张牌和最后一张牌一定是一样的(如图所示,都是2)(另外,下面的图,名字分别是4个字和3个字,随机的,男女是随机的,南方北方也是随机的)(5)最后,留一张扔一张,最后留下的那半张就是之前藏起来的那半张了。(2)当拿走第一张牌2的时候,另外一张2一定在最下面,这也很重要。程序如下,写的有点乱。

2024-02-10 00:25:28 517 2

原创 C语言指针的几种用途

数组本身是一个变量,而变量呢,它是内存中的一块区域,所以,通过指针访问数组中的元素,实际上就是通过指针获得了变量所在内存的控制权。由于数组元素在内存中是连续分布的,所以这个指针可以通过++或者--操作访问数组里的元素,这个指针它还描述了“位置信息”。程序追求三个目标“简洁、高效、安全”,c程序的错误,除了逻辑错误之外,最多的就是内存错误,“高效”是c语言的优点,但是安全性……count是一个指针,它指向了原来的实参,通过指针可以直接修改原来的实参,实际上,通过指针获得了实参所在内存的控制权。

2024-02-02 21:36:23 429

原创 字符串匹配之BF算法、KMP算法

如果主串这次的匹配,是从主串的100位置开始比较的,那么当匹配失败时,下次匹配应该从101位置开始比较,所以i应该先退回到这次比较的开始位置100(主串应该从当前位置i往回退多少个字符呢?刚才说过了,j的值等于已经匹配成功的字符个数,所以“j的值和t的长度相等”说明已经匹配成功的字符个数等于t的长度,即t已经匹配成功。如果s[i]和t[j]不相等,那么,重置i和j的值,然后重新尝试匹配。方法4:KMP算法,经典的字符串匹配算法,和BF算法的区别主要在于,当匹配失败时,如何重置i和j的值,这个……

2024-02-02 00:12:54 857

原创 求素数个数

求素数个数

2024-01-14 12:38:55 396

原创 kmeans聚类算法C++实现

kmeans算法实现和动态演示

2024-01-14 12:38:03 656

原创 C++ STL set的使用,一道算法题,化繁为简、化难为易

在for auto循环中,加入到set中的新元素,等会也会自动被访问(被处理)。最初,当1在集合中时,2*1+1=3被加入到集合,这个3等会也会继续被访问(被处理),也就是说3*2+1=7会被加入到集合,这就是一个无限循环,这个无限循环恰恰就是我们想要的。下面的代码没有什么复杂逻辑,看不到去重,也看不到排序,都是set的功劳。数据量加到10万,set说:小菜一碟,我的效率不错吧。看似不难,就是排序、去重而已,元素个数如果不是50,而是10万、100万,要用纯C语言写出高效的算法,还是有一定难度的。

2023-11-23 23:29:41 839 1

原创 约瑟夫环 --- C++ STL 容器的使用

准备使用vector容器,它类似于C语言的数组,优点是容量可以动态增长,缺点是有大量删除操作时,效率可能有点低,因为删除某个元素之后,后面的元素需要前移,从而保证所有元素的地址是连续的。如果用纯C语言数组写,而且不使用递归,代码还是要写好几行的。因为算法伪代码写出来之后,代码也自然写出来了。使用vector容器之后,代码不是最简单的(使用递归可以一句话完事),也不是效率最高的(因为有删除操作),但是,代码写起来很自然。重置begin=刚删除元素的位置+1(若删除元素后,后面元素会自动前移,则不用+1);

2023-11-23 12:55:01 274

原创 C++ STL 之 无序map(unordered_map)的使用

但是,如果数据量超过百万,无脑双重for循环肯定会超时(如果是十万数据量,超时不明显,毕竟双重for循环只有10^5*10^5=10^10次,刚好是1秒左右),如果自己定义一个数组a[1000001](当然不能直接这样写,要动态申请内存),用来统计每个数出现的次数,也是可行的(比如55这个数出现的次数可以直接保存在a[55]中,100万这个数出现的次数可以保存在a[1000000]中)。但是,如果数据的范围没有限制在100万以内,就会出现问题,如果有1亿零55这种很大的数,这个数出现的次数存放在哪里?

2023-11-22 23:26:59 792

原创 人工智能之进化计算:基于遗传算法求解TSP问题,C/C++实现

算法主要思想:根据当前种群生成两份样本,第一份:用当代最好的一半样本直接变异,生成一份新的样本;第二份:从当代最好的一半样本中随机选择,构成新的另一半样本,不变异。第一代种群的个体可以随机生成,也可以先利用贪心算法,生成一个较优的路径(在初始种群中有一个优秀的个体),这一步有无对最后结果没有影响。和生物界中生物的繁殖进化一样,遗传算法的过程主要包括:选择,交叉,变异,每次迭代都能生成比上一代更好的种群。使用多线程,每个线程单独求解,最后汇总所有线程的结果,取最优的。每个数据集的距离计算公式不一样,参见。

2023-11-16 00:24:27 854

原创 机器学习一元线性回归的几种实现

运行结果如下,对于某一个输入值x,可以通过前面几个方法求得的w和b值,利用y=wx+b求得y值,与此同时,也可以利用训练好的神经网络,从输入层到隐藏层到输出层,依次加权求和(神经网络中没有使用激活函数,只能拟合线性函数),计算出y值。神经网络虽然不知道w和b值,但是它计算出来的y值和利用y=wx+b计算出来的y值几乎相等。然后,对于一个输入值x,可以利用这个神经网络,预测输出值y。方法5: 神经网络(BP神经网络,有输入层、隐藏层、输出层),c实现。然后求y=wx+b的w和b值。

2023-11-15 23:25:47 600

原创 C/C++ 实现贝叶斯分类算法

下面是用冷门函数式编程语言写的,代码比C简单很多,算出来的概率0.178089,和上图一致,都是P(J|0,0,0,1),即:对于样本(帅、性格好、高、不上进),预测嫁的概率是0.178089。最后比较两个概率的大小,得到预测结果。1表示肯定,0表示否定)和1个分类结果(嫁不嫁,1表示嫁,0表示不嫁),如果有更多的真实样本,预测效果会更好。运行结果如下,首先是20个样本的分类预测结果(20个样本既作为训练数据,也作为测试数据),准确率80%(20次预测错了4次),不是很高,主要是因为样本数量比较少。

2023-11-08 11:27:51 707

原创 C/C++ 实现K近邻分类算法

运行结果如下(1,2,3分别表示讨厌,有点喜欢,很喜欢),100个测试样本错了4个,算法没有问题,一般是样本有问题,比如一个男的,他的3个特征反映出这个男的很优秀,10个女的有9个女的会喜欢这个男的,偏偏有1个女的不喜欢,对于这样一个样本,程序给出的预测结果和真实结果会不一致。另外,偷了个懒,没有动态申请内存,因为样本数据量不大,栈空间基本够用。每行有4个数据,前3个是样本特征(飞行公里数,玩游戏时间百分比,吃冰激凌公升数),最后1个是分类结果(很喜欢,有点喜欢,讨厌)。原始数据的分隔符是制表符\t。

2023-11-08 09:45:12 557

原创 C++实现A*寻路算法

和dijkstra算法一样,整个图是慢慢被探索的,所以也需要定义两个集合,一个是已经处理(探索)过的点的集合,另一个是待处理的点的集合(“待处理的点的集合”并不等于“未处理过的点的集合”,前者指的是已经看到但未处理的点,后者还包括那些在远处尚未看到的点)。A*算法的核心公式是F(起点到终点的距离)=G(起点到当前点的距离,即已经走过的路)+H(当前点到终点的距离,即还没走过的路)。2.将该点的8个邻接点(边界点、障碍物、已经处理过的点,这三者除外)放入open_list中,当遇到了终点时,break;

2023-11-07 00:07:22 1353 1

原创 C/C++实现手写数字识别,分别处理 32*32 文本数据集和mnist 28*28 png数据集

简便起见,对样本个数做了一些简化,32*32数据集的训练数据是180*10=1800个,测试数据是80*10=800个,mnist数据集的训练数据是5000*10=5万个,测试数据是800*10=8千个(原始测试样本是1万个,每个数字的测试样本个数不同)。从数据量对比来看,后者是前者的280倍(训练数据集是28倍,测试数据集是10倍),对应的程序运行时间(计算测试样本的预测准确率)后者也是前者的200多倍(排序算法很重要,如果不使用小根堆求TOP K,而是使用传统的整体数据排序,估计运行速度会差很多)。

2023-10-22 14:47:37 748 1

原创 C/C++利用迪杰斯特拉最短路径算法,求解千万结点道路网最短路径

假设这个点是A点,它的distance值是50(从起点到A点的距离值是50),它有一个邻接点是B点,此前B点的distance值是100(从起点到B点的距离值是100),又假设A到B的距离只有10,那么我们发现:经过A到达B,有一条比之前100更短的路径,即50+10=60,这时候将B的distance值更新为60,意味着我们找到了一条从起点到达B点的更短的路径。第一,找最小值,用什么方法?很自然的,程序刚开始,要把所有点的distance值(从起点到该点的距离)设置为无穷大,意味所有点都是不可达的状态。

2023-10-14 00:16:00 233 1

原创 动态演示操作系统进程调度算法,FCFS, RR, SPN, SRT, HRRN

定义一个定时器Timer,然后把之前的代码都放到这个Timer里,每隔0.1秒钟执行。部分代码如下,俺是C和C++混用,比如用时候用#define定义符号常量,没用const定义常量。这次改成了动态演示,使用了上古神器MFC(微软基础类库)来做界面-_-#怎么发不了视频,视频要审核?-_- 只能发两个截图。

2023-10-13 00:15:58 228

原创 字符串逆序输出,编译器优化,循环代码外提,无效代码删除

执行时间大概是0.1秒多,相当于10^8(10的8次方)纳秒,for循环体循环次数刚好也是10^8,掐指一算,每次循环的平均执行时间是1纳秒,仅仅相当于从L1 cache取一次数据的时间,C语言叠加宇宙第一IDE优化的BUF,果然快的离谱。编译器的优化确实厉害,直接删除无效的代码,如果程序中的某些语句对输出没有影响,那么这些语句被视为无效代码 ,不执行。再看看汇编代码,这次看到了一亿的身影。

2023-10-10 18:08:03 134 1

原创 C++实现BP神经网络,分别对线性函数和非线性函数的样本进行预测

运行结果如下,绿色的线是y=x*x的函数曲线,红色的点是BP神经网络根据x值预测出来的点。实现了一个简单的BP神经网络,有时候预测效果较好,有时候预测效果不好,像“人工智障”。下面针对20个测试数据,绘制x坐标值和神经网络预测的y坐标值。

2023-10-10 00:34:57 542 1

原创 C/C++ 批量梯度下降法实现一元线性回归

主要思想:根据y=wx+b计算出来的y值和实际y值是有误差的,根据这个误差去更新w和b的值(具体计算公式需要用到偏导数,程序中的变量“xxSum”体现了“批量”),更新速度快慢取决于学习率的大小,当w和b的值几乎不再更新时,意味计算出来的y值和实际y值的误差已经很小,这时候停止迭代,求解完成。给定一组样本,{1,5},{2,7},{3,9},{4,11},{5,13},根据样本预测一元线性方程y=wx+b中的w值和b值,可以用数学的最小二乘法求解,这里使用批量梯度下降法求解。

2023-10-06 00:14:29 483 2

原创 C/C++实现编译原理自上而下语法分析(非递归,查LL(1)分析表)

总体思路:根据栈顶符号和输入串的的当前符号,来决定下一步的动作。如果栈顶是一个终结符,那么尝试将该终结符和输入串的的当前符号进行匹配,如果栈顶是一个非终结符,则查找LL(1)分析表,如果找到了某个产生式,则产生式左部符号出栈,右部符号逆序进栈。(参照陈意云的编译原理教材。非递归实现,必须使用一个栈来完成。运行结果如下,其中N表示空串。E'->+TE'|空。T'->*FT'|空。

2023-10-02 22:23:01 556 2

原创 C/C++实现编译原理词法分析

本词法分析程序主要识别关键字、标识符、数值常量(包括整数、小数、指数常量),识别指数常量时,使用了大量的goto语句(参照陈意云教材上指数常量的自动机)。其它类型的单词暂时未识别,可以自己添加更多的分支结构识别更多类型的的单词。

2023-10-02 22:04:53 114 1

原创 C/C++实现操作系统进程调度算法,FCFS, RR, SPN, SRT, HRRN

进程信息定义在方法InitProcedureInfo中,包括:procedureID(进程ID), arriveTime(进程到达时间), serviceTime(服务时间), eclapsedTime(已服务时间), remainTime(剩余服务时间), accumulateTime(累计服务时间)。本程序的优点在于,一旦实现了其中一个调度算法,比如实现了最基本的FCFS之后,只要增加一个排序逻辑,即在重载

2023-10-02 21:33:22 865 2

原创 C语言求两个日期之间间隔的天数

翻到了2005年3月31日,此时变量month是3,day是31,继续翻页,变成了3月32日,这时候,我们发现32大于3月份的天数(31),于是,将month加1,并且day置为1。特殊情况,如果是2005年12月31日,如果翻一页日历,就会变成2005年12月32日,先变为2005年13月1日(month加1,并且day置为1),然后变为2006年1月1日(year加1,并且month置为1)(3)这种一页一页翻日历的思路,不但可以求两天的时间间隔,还可以求从某一天开始往前或者往后经过若干天的日期。

2023-09-29 15:35:09 1461 1

原创 C++ 1亿数据二次排序

C++、一亿数据、二次排序

2023-09-24 22:57:08 126 1

原创 使用Spark(伪)分布式计算对1000万数据进行排序

Spark、分布式计算、1000万数据排序

2023-09-23 21:49:56 126 1

原创 1000万数据排序,C++并行排序函数+多线程

并行排序函数,多线程

2023-09-22 22:30:04 423 1

原创 1000万数据排序

1000万整数排序

2023-09-21 22:31:02 216 1

原创 找出10个数中的最大值

上面两种写法,第二种写法,直接用别人造好的轮子,“不用自己重复造轮子”。试试从1000万个数据找最大值,需要多少时间?

2023-09-19 17:42:13 228 2

原创 尽信书不如无书,空行、缩进、大括号、变量见名知意……都很重要

程序书写风格:空行、缩进、大括号、变量见名知意

2023-09-18 23:19:59 131

原创 数据类型、变量、赋值语句

【代码】数据类型、变量、赋值语句。

2023-09-15 23:00:13 138

原创 我的第一个C程序:hello world

我的第一个程序:hello world

2023-09-15 17:14:13 261

原创 2023.09.10

计算机五大部件、二进制、存储程序原理

2023-09-10 13:25:14 236 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除