笔记
pro_or_check
“公共命名空间”的作者,孤独的思考者。
展开
-
编译原理:代替LR的MP:2.遇到的问题
MP分析法可以代替LR分析法,并且还能有所超越。这是一个有希望的研究方向。发明LR分析法的Knuth先生还健在,它看到MP分析法之后,会怎么想呢?原创 2024-06-17 10:26:22 · 252 阅读 · 0 评论 -
C语言,scanf出错时,重新输入
使用scanf进行输入时,如果遇到输入错误的情况,stdin中会剩余一些错误的字符,先把它们吃掉,才能正常地进行下一次输入。另外,scanf支持正则表达式。原创 2023-12-18 15:51:11 · 977 阅读 · 0 评论 -
大数除法的方法,商法和余法
本文描述的算法与Knuth的除法算法很像,是对大神的膜拜,和对知识的整理。本算法模拟手算除法,用于进行大数除法。希望本文对你有所帮助。❤️。原创 2023-12-13 06:36:51 · 631 阅读 · 0 评论 -
手机输入法设计
九键拼音输入法,需要点三下输入一个汉字。原创 2023-12-12 16:31:37 · 446 阅读 · 0 评论 -
编译原理,根据文法产生式,生成语言的全部句子
gz里边是文法产生式。这里用的是《编译原理》虎书中的文法3-1。将fc执行多遍,可以得到更长的句子。原创 2023-12-10 07:57:37 · 441 阅读 · 0 评论 -
Python,非二进制的霍夫曼编码
非二进制编码的作用:例如,设计九键输入法,希望根据拼音的概率来编码,常用的拼音分配较短的编码。这时,需要使用九进制霍夫曼编码,N=9。一般来说,霍夫曼编码是二进制的,但是非二进制的也可以。本文中,通过修改N,可以得到任意进制的霍夫曼编码。算法的主体,是先排序,选出概率最小的N项,合并成1项。合并的过程中,概率相加,符号相连。然后,用正则表达式获取data到a,a的结构要看清。本算法没有创建树状结构,而是通过字符串运算来完成的。data是符号和概率,用制表符和换行符分割。修改N=9,即得到九进制编码结果。原创 2023-12-01 08:07:34 · 399 阅读 · 0 评论 -
笔记,B+树
一个四层的1000叉树,有1000的三次方个叶子节点,即,10亿条记录。多数情况下,这足够多了。一般来说,那一列是个数字,可如果是字符串呢,且长度不确定,B+树的节点中要储存999个字符串吗?一个表中的10亿条记录,按照添加时的顺序存储,需要按照某一列保持有序时,以B+树做索引,10亿个有序的硬盘指针指向10亿个乱序的记录。在B+树中,比如说,每个节点储存999个数字,它能产生1000个分叉,对应地有1000个硬盘指针储存在节点中。通过增加树的分叉数,降低树的高度,从而减少存储器的访问次数,有提速效果。原创 2023-11-26 14:06:02 · 669 阅读 · 0 评论 -
UTF-8和UTF-16简介
首先介绍unicode,最开始计划有31位,但到后来一执行,发现0x 0~10FFFF就够用了,仅有21位。UTF-8是一种变长、多字节编码方案,从一字节模式,到六字节模式。虽然unicode只到21位,但是查看pcre2的源代码发现,对UTF-8的支持到六字节。0*******110***** 10******1110**** 10****** 10******11110*** 10****** 10****** 10******这里仅罗列到四字节模式。分析一个UTF-8编码的文件,看第一原创 2022-06-25 14:54:28 · 5284 阅读 · 0 评论 -
霍夫曼编码的三个缺点
霍夫曼编码是理论上最优的压缩编码,适用于压缩,并不适用于字符编码。将unicode中的100多万个字符统一使用霍夫曼编码,是个不成熟的设想。具体分析,它有三个缺点。一、对起点敏感。需要从文本的开头处解码,才能得到正确的结果。不能从半路开始解码,如果文本很长,也要从开始处解码。二、暴露语言的“指纹”。这个指纹指的是密码学中的概念,例如英语中字母e出现的频率高,那么,在加密解密过程中,这就是个漏洞。很有可能从字符的频率出发,破解密码。三、字符顺序乱了。用正则表达式处理0-9,a-z,仅需做数字加减法就行了原创 2022-03-18 20:01:06 · 4017 阅读 · 0 评论 -
C语言,求1000以内的质数
//求1000以内的质数#include <stdio.h>#include <math.h>#define N 1001int a[N];int main(){ for(int i=0;i<N;i++) a[i]=0; a[0]=1,a[1]=1; for(int m=2;m<=sqrt(N);m++){ if(a[m]==1)continue; for(int k=m*m;k<N;原创 2022-03-04 11:49:34 · 4609 阅读 · 0 评论 -
双拼输入法,设计方案
这是一套双拼输入法,点两下输入一个汉字。其他输入法都是按照英文键盘设计的,本输入法不是。它重新设计了声母的位置,让组合最多的声母l放在了接近中央的位置。使用传统的输入法,输入la,手指要从右向左移动很长一段距离,不是很方便,所以有了本方案。与其他双拼输入法一样,对韵母进行了“压缩”,如iang/uang放在了一个键位上。但不同之处是,对于不同的声母,韵母的分布略有不同,其目的是让单手输入时,手指移动距离减小。方案如图:...原创 2022-01-14 18:37:30 · 457 阅读 · 0 评论 -
提点建议
建议一:阅读了一段内容后,会增加和作者的“亲密度”,以后会增加推广该作者的其他内容。读者A阅读了作者B的文章5篇,作者C的3篇,则以后在“亲密度推荐”版块里,按5:3的比例推荐B和C的其他文章。对文章的评分功能,实际上是修改访问量,如果看过一篇文章后,觉得没有收获,想要回收这次访问量,就评分为-1。评分有5档,-2 -1 0 +1 +2,如果不做操作,则评分为0。不推荐自己的文章。作用:一、动员读者给文章评分二、把人分成群,避免热榜过于拥挤建议二:和办公软件合作,改进博客的编辑功能。CS原创 2022-01-12 16:49:38 · 85 阅读 · 0 评论 -
科幻,公共命名空间
1C语言的命名空间有点乱,C++有namespace,但也没好到哪去。他们共同的缺点是:没有公共命名空间。如果国家动员大家建设公共命名空间,那么人们会分为四个流派:简约派、完整派、中文派、反对派。举例来说:atoiConvertStringToInteger把字符串转换成整数……反对派用沉默抗议,或者写一些乱七八糟的东西,打乱刚刚建立起来的秩序。因为有反对派存在,所以,需要把不同人的劳动成果分离,不要把所有食物混在一个桶里!中文派也区分为简约中文派、完整中文派,这里边的完整中文派原创 2022-01-05 07:17:34 · 275 阅读 · 1 评论 -
C语言笔记,返回函数指针的函数
#include<stdio.h>typedef int (*Func)(int,int);int add(int a,int b){ return a+b;}int sub(int a,int b){ return a-b;}Func f(char op){ switch(op){ case '+':return add; case '-':return sub; }}int main(){ int a=原创 2022-01-03 17:56:47 · 630 阅读 · 0 评论 -
UTF-64
之前的两篇博客讨论了UTF-48编码,其中的“借比特与还比特”功能并不容易实现。抛弃并重新设计后,有了UTF-64。它统一采用13比特做语言编码,之后用64-13=51比特做字符编码。51=7×7+251=8×6+351=9×5+6(舍去9比特模式)51=10×5+151=11×4+7(舍去11比特模式)51=12×4+351=17×3+051=21×2+9=25×2+1(unicode还有扩充空间)8字节表示2个unicode,或3个汉字。因为9比特模式和10比特模式,都是8字节表示5原创 2022-01-01 09:46:13 · 723 阅读 · 0 评论 -
C语言笔记,数组下标越界,栈结构
//b[5]越界了,0..4#include <stdio.h>int main(){ int a=6543,b[5]; printf("%d",b[5]); return 0;}这个数组下标越界很明显,声明时明明是b[5],使用时却不能用b[5],没错,C语言就是这样设计的。这段程序将显示一个随机值吗?错,它显示变量a的值,即6543,不是随机值。这是为什么?要从栈的结构说起。栈是从高地址向低地址生长的,main函数开始时,先分配一个a,再分配5个in原创 2021-12-31 17:13:06 · 618 阅读 · 0 评论 -
C语言笔记,生成随机数
//生成随机数#include <stdio.h>#include <stdlib.h>#define rand_int(a,b) (rand()%(b-a+1)+a)int main(){ int a,b; long r; //srand((unsigned int)time(NULL)); a=rand(),b=rand(); //这样写不对,要加类型转换 //r=a*b; r=a*(long)b; //原创 2021-12-31 13:18:38 · 317 阅读 · 1 评论 -
C语言笔记,scanf出错时重新输入
//scanf出错时重新输入#include <stdio.h>int main(){ int a,b,n; while((n=scanf("%d%d",&a,&b))!=2){ printf("error,scanf return %d\n",n); while(getchar()!='\n'); } printf("%d,%d",a,b);}这里有两层while循环,第一层用于检测scanf的返回值原创 2021-12-26 09:11:36 · 4711 阅读 · 3 评论 -
C语言笔记,把一个数组拆成两个数组用
//把一个数组拆成两个数组用,并填充随机数#include <stdio.h>#include <stdlib.h>int main(){ int *mem=(int*)malloc(sizeof(int)*20); int *a,*b; //这句是关键,拆分 //a=&mem[0] , b=&mem[10]; a=mem,b=mem+10; for(int i=0;i<20;i++){ m原创 2021-12-26 06:42:47 · 2433 阅读 · 0 评论 -
C语言笔记,按字节输出结构体
//按字节输出结构体#include <stdio.h>struct test{char c;int n;};int main(){ int i; struct test a={'a',0xffff}; for(i=0;i<sizeof(struct test);i++){ printf("%2x ",((char*)&a)[i]); } return 0;}以上代码实现“按字节输出结构体”的功能。首先定义str原创 2021-12-25 12:39:56 · 1919 阅读 · 0 评论 -
UTF-48编码(2)
这是一种计算机字符编码,它用48比特(6字节)为单位。用6字节表示2个汉字,或是5个ASCII字符。它还可以支持全世界5651种语言,并争取做到各种语言编码长度尽可能相同。对于小于128个字符的语言,使用7比特模式,全世界有5651种语言,用13比特表示lang字段,剩下的48-13=35比特,有35=7×5,可以表示5个字符。例如,英语就采用7比特模式。当字符数不足5个的时候,用-1占位,如表示abc,则记为a b c -1 -1。用二进制表示-1,即7个1,1111111。所以,7比特模式可以表示12原创 2021-12-16 06:15:43 · 453 阅读 · 0 评论 -
C语言,fwrite fread scanf笔记
fwrite和fread参数顺序要牢记fwrite(buf,sizeof(int),10,fp);fread(buf,sizeof(int),10,fp);在其他函数里,一般是先写fp,如:fprintf(fp,"%d %d",m,n);在其他函数里,一般是先写个数、后写长度,如:qsort(a,10,sizeof(a[0]),comp);这可以理解为把数组a[10]写做a,10。然而,在fwrite和fread中,fp在最后,且先写sizeof后写个数。这一点需要牢记。scanf注意事项原创 2021-12-11 15:53:36 · 531 阅读 · 0 评论 -
UTF-48
编码→编辑→编译,停留在最初阶段……1、UTF-32/3一个汉字的信息量约等于三个英文字母举例来说:I’m a painter,13我是一个粉刷匠,7The amount of information in a Chinese character is about equal to three English letters,88一个汉字的信息量约等于三个英文字母,17Transforms the different translation way,40转换不同的翻译方式,9Apples原创 2021-12-05 07:07:41 · 282 阅读 · 0 评论 -
文件系统,一些没用的知识
文件系统包括:获取数据位置的方法访问权限用户界面整理磁盘、数据恢复等工具针对第一条,有“基于地址映射”的方法。举例如下:file 0 100 → dir 50 150dir 0 1000 → partition 1500 2500partition 0 5000 → disk1 0 5000partition 5000 10000 → disk2 0 5000这是从文件开始映射的。当需要在file中间插入数据时,不需要大规模的读写操作,尤其是file很大时,这种优点将更明显。节点原创 2021-12-03 19:06:37 · 66 阅读 · 0 评论 -
浮动电路CPU设想
浮动电路CPU设想,CPU放弃固定电路,全部采用浮动电路。单独一个执行单元很小,但是有许多这样的执行单元。没有了指令集的概念,所有电路都要从内存装载。原创 2021-12-01 07:57:09 · 679 阅读 · 0 评论 -
字符编码,扩展unicode,三字节表示一个汉字,或两个字母
Unicode有一百多万个字符,0-0x10FFFF,占21比特。Unicode有多种传输格式,如UTF-8,UTF-16等。对于UTF-8,一个英文字母占1字节,一个俄文字母占2字节,在美国和俄罗斯之间并不平衡。对于UTF-16,美国和俄罗斯平衡了,都用2字节表示一个字母。但是,汉字也用2字节表示,汉语的句子明显短,又不平衡了。为解决以上不平衡,扩展unicode至24比特,用3字节表达一个汉字,或是两个字母。现在世界上查明的有5651种语言。在这些语言中,有1400多种还没有被人们承认是原创 2021-11-28 06:59:00 · 2306 阅读 · 0 评论 -
把正则表达式和集合论结合使用
挑选汽车的号码牌,希望得到ABC开头的,但是又不想要包含250的组合,这个正则该怎么写?$s ~= /^京ABC/这样写满足了条件一,但不能排除250。$s ~= /250/这样写满足条件二。正则表达式本质上是进行集合的属于操作,$s是元素,/…/是集合,判断元素是否属于集合。本文开头处的要求,是求集合的减运算,从ABC开头的集合中,减去包含250的。A-B,即A交B补,这是集合论的知识。所以,本题的答案是:$s ~= /^京ABC/ and (not $s ~= /250/)初学正则表达式原创 2021-11-27 12:24:05 · 279 阅读 · 0 评论 -
新编译原理和集合论
1以句子为单位,理解源代码。使用集合论,一个句子对应多个字符串,储存在一个集合中。通过集合间的操作,精准地控制集合里边有哪些句子。集合论中的集合,对应文法产生式中的非终结符,但不同之处是,集合论对句子的操作更灵活。具体来说:分配[30]个[学生类]至[班]。ban=malloc(30*sizeof(Student));它可以翻译成如上的C语言语句。新编译原理将是一种翻译,从类似自然语言的源代码,翻译成现有的计算机语言的源代码。如何使用集合论?集合间的运算有“加、减、连接”,分别如下:A+B,即A原创 2021-11-26 17:05:08 · 275 阅读 · 0 评论 -
分布式文件系统
学习了hadoop的文件系统,觉得它有个缺陷,就是当数据丢失时,难以恢复。所以,展开如下思考。以文件为单位,而不是以数据块为单位。有一个数据库,储存着哪个文件存放在哪台计算机中。可以这样设计表结构:表1=(全局路径,计算机名)表2=(计算机名,存储量,剩余量)表1的每一行对应一个文件,表2的每一行对应一台计算机。例如,添加一个文件的操作,添加到全局路径"/data/file1"中。通过查询表2,确定添加到哪台计算机,然后在其中按照全局路径创建文件。修改表1、表2。这么设计的结果,是每台计算机中都原创 2021-11-17 12:02:38 · 657 阅读 · 0 评论 -
人工智能,激励函数
已经看到的有20多种激励函数,继续研究下去有必要吗?我来提出另一个激励函数:f(x)=ax3+bx2+cx+d这个函数的特点是,存在待定参数,把这些参数同那些w,b一起训练,结果会如何?已知的网络模型,都是所有神经元使用相同的激励函数,本文尝试让它们使用不同的。选择三次方程是因为,它会拐三个弯,在某个区间,看上去像ReLU。当然,这需要正确地配置参数,只能寄希望于梯度下降法了。哪位高手能试一试,试过之后给我留言吧。...原创 2021-11-24 16:19:56 · 1679 阅读 · 0 评论 -
软件连锁店
全国有14亿人,700万程序员,占比1/200,一个2万人的乡镇,有100个程序员,建立软件连锁店,让程序员在家门口上班。通过网络,把全国的程序员连接起来,形成规模效应,编程序需要的知识点很多,一个人的力量明显不够,需要通力合作。从大龄程序员开始,从大城市转移到家门口,在乡镇级别的行政单位建立起软件连锁店。首先,店里只有40岁以上的,后来,考虑到在大城市生活的压力,去掉租房等开销,剩下的钱又不够买房的,许多刚毕业的年轻人也选择来店里工作。最后,我国模仿美国硅谷建立起来的中关村模式,被软件连锁店模式取代。原创 2021-11-16 15:00:44 · 115 阅读 · 0 评论 -
堆、栈的关系
CS:代码段,DS:数据段,SS:栈堆向上生长,栈向下生长栈单独占一个段,堆在数据段里C语言的malloc,C++的new,Java的自动垃圾回收,都在堆里os调整数据段大小的函数,搜索brk栈的大小,用push,pop指令调整,这是由cpu提供的...原创 2021-06-27 19:03:20 · 236 阅读 · 1 评论 -
一种图像映射方法
原创 2021-06-10 20:06:13 · 136 阅读 · 0 评论 -
动态链接库在linux和windows的区别
windows上的动态链接库是dll,而linux上是so另外还有静态链接库,和目标文件。原创 2021-06-09 10:59:24 · 177 阅读 · 0 评论 -
作者-读者模型
有一群人,他们既是作者,也是读者。也就是说,自己写自己看,没有旁的人当他们的读者。这群人每人每7天写1篇文章,每人每天读7篇文章,则平均每篇文章被读49次。若每人每天写1篇文章,看3篇文章,则平均每篇文章被读3次。有公式:每人每天写A篇,读B篇,每篇文章被读C次,则A×C=B。将这个公式应用于博客,当作者写出太多文章后,读者没有精力读,则每篇文章的访问次数不会太大。期待中的写一篇文章有几千人来读的情况没有发生。...原创 2021-06-09 06:29:12 · 193 阅读 · 0 评论 -
C语言,fopen之打开模式
用C语言已经很多年了,可今天仍然在一个问题上纠结了20分钟,记录下来。fopen的第二个参数有讲究,它是文件的打开模式,用不同的模式打开文件,效果不同。模式一共12个,一一道来。12=3×2×2,模式分三组,分别是rwa+bt,第一组,rwa=read,write,append,read=读,write=写,且是覆盖掉原始内容的覆写,append=追加,在文件末尾写入,原始数据不会丢失。第二组,+,在r, w, a基础上发展而来的r+, w+, a+,有了加号后变成可读可写,不过w+仍然是覆写,a+仍原创 2021-06-08 09:34:23 · 1721 阅读 · 0 评论 -
软件开发的流程(图)
原创 2021-06-05 09:16:40 · 92 阅读 · 0 评论 -
英文数字汇总,KMGT,毫微纳
以5MB为例,现在的习惯是读作“五兆”,可是,兆的本意是万亿,在这里却成了百万。5MB的标准读法应该是“五百万字节”。网络的带宽,100M,常读作“一百兆”,若读作“一百百万”,会有人反对,可1000㎞不是也读作“一千千米”吗。还有气象预报的“五百百帕”。E和亿发音相同,要注意区分。网络上和中央电视台的说法是,“研制每秒百亿亿次超算”。...原创 2021-05-31 08:16:37 · 4912 阅读 · 0 评论 -
笔记,C语言二维数组
float a[3][2]按行列式理解,这个二维数组有3行2列。画出图来应和他人保持一致,不要写成2行3列。float a[3][2]={{1,2},{3,4},{5,6}};按顺序理解,a[3][2]首先是a[3],所以大括号里有3个大括号,不要写成:float a[3][2]={{1,2,3},{4,5,6}};//错了把数组作为函数的参数void f(float* x,float** y){ x[i]//可以这样用 y[i][j]//错了}由于没有传递二维数组的原创 2021-05-28 06:13:23 · 1038 阅读 · 0 评论 -
求两幅图像的距离
关于距离,常用的是由勾股定理推广而来的公式,就是求平方和的那个。对于图像,如果有一个点偏差较大,会看起来很明显。或者说,有两幅图,它们只有一个像素不同,但是这个像素的差值较大,看上去也是很明显的。修改距离公式,从平方和到指数函数,以求扩大差值。应用领域:图像、视频压缩算法,当压缩后和压缩前的图像的距离较小,可以忽略时,认为压缩成功,这是种有损压缩。人工智能之梯度下降法的损失函数,它描述的是现在的状态和目标状态的距离,也可以试用此距离公式。求两个像素的颜色的距离,似乎不适用于公式2,应该用公式1。因为原创 2021-05-23 16:34:38 · 1275 阅读 · 0 评论