- 博客(36)
- 收藏
- 关注
原创 三块芯片搭建一台计算机并运行机器语言
目录 数据总线和地址总线I/O控制DMA直接存储器访问计算机的工作过程如何为该计算机写入机器语言程序搭建一台8比特微型计算机,所需的基础原件仅为CPU、内存和I/OCPU是中央处理器,负责执行程序内存用于存放程序和数据I/O用来将计算机和外部设备进行连接此外还需要8位的指拨开关作为输入,8个发光二极管作为输出(指拨开关拨上拨下对应输入的01,二极管亮灭对应输出的10)。搭建后的全貌如下图所示,凭空想象不易,搭建时对照图片思考可以事半功倍。数据总线和地址总线数据总线搭配地址总线,实现在确
2022-03-11 17:51:24
479
原创 零基础完全背包问题 学会思考就掌握了本质
完全背包细节完全背包问题描述与举例举个例子对比01背包和完全背包在递推关系上的不同二维dp求解完全背包手推一下dp数组的迭代过程加深理解一维dp的优化在理解完全背包问题之前,必须先深刻理解01背包的思路。参考链接:链接: 零基础01背包问题 有口诀.完全背包的递推关系乍一看与01背包大差不差,但是如果不能深入理解细节,那么在面对笔试和面试中的各种完全背包变形问题时,就会束手无策。很多人都不会做动态规划问题,我认为所谓举一反三,就是要形神兼备,不仅仅是记住他的样子,还要深入思考这个样子的来历,这才是动态
2021-11-12 13:30:37
653
原创 零基础学01背包 口诀是物品一件一件增加,背包一点一点变大
01背包问题的资料看下来,我总结了一句话,物品一件一件增加,背包一点一点变大。小白01背包问题与优化01背包问题描述动归三部曲1.定义dp数组2.递推公式3. 初始化C++代码实现 含详细注释手推一次dp数组加深理解 为优化打基础滚动数组优化动归三部曲1. 定义dp数组2. 递推3. 初始化C++代码加注释01背包问题描述最基本的01背包问题描述是,有一个限重W的背包,有好几件重量为weight,价值为value的物品供你挑选,要在不超过背包限重的前提下,巧妙地选择物品,使得背包里面的物品价值最大。
2021-11-11 00:12:02
746
原创 KMP算法实现 画图太妙了 循序渐进 汪汪都能学会的KMP
KMP算法讲解的很多,清晰的很少,在此写一个汪汪都能看懂的通俗易懂直观的精讲。文末会给出学习建议。循序渐进KMPKMP算法的由来和本文术语解释为什么要有next数组以及对他的直观理解精华!next数组的代码实现 图预警递归思路如何画图理解计算next时初始化值如何确定计算结果的图形化解释KMP算法的代码实现利用next实现KMP的关键要点运行结果的图形化解释==最后的学习建议==KMP算法的由来和本文术语解释KMP算法的中文名称为快速模式匹配算法,是为了快速解决在一个字符串中查找另一个字符串的问题。(
2021-11-01 21:48:10
542
1
原创 MacOS VScode 运行最简单的C++程序
第一步1.AppStore安装Xcode安装完在iTerm终端输入clang - v检验,出现以下版本信息表明安装成功,因为Xcode自带了clang。
2021-07-20 19:48:47
2132
5
原创 计算机系统基础 概述内容
计算机系统基础概述冯诺依曼结构现代计算机结构== 计算机是如何工作的====指令和数据在程序的执行过程中是怎么移动位置的?====汇编语言和高级语言====HelloWorld程序执行过程====开发和运行程序需要什么?==冯诺依曼结构最初的计算机是冯.诺依曼结构,包含了很多最重要的思想,一直沿用至今。现代计算机结构控制器是进行指令译码生成控制信息的。== 计算机是如何工作的==答:程序由一条条的指令组成。程序在执行以前,数据和指令都事先存放在存储器中,每个指令和数据在存储器中都有自己的地址
2020-12-05 21:33:11
557
原创 力扣刷题99恢复二叉搜索树 java版
原题链接:https://leetcode-cn.com/problems/recover-binary-search-tree/最初的想法:找到两个交换的数据,然后换一下。找数据的时候用到中序遍历,交换的时候需要寻找到节点再替换。代码出现了很多的错误,基本都集中在找交换数据的时候,有时候找不全有时候又多找,很难找到适应各种情况的被交换数据。改进:惯性思维是bst中序遍历会将值升序,可是我只在动态数组中放入了值,最后交换的时候还是需要找,不如直接把节点放进动态数组,不是找值,而是直接找节点。寻找被交
2020-11-25 20:56:51
205
原创 力扣刷题 剑指Offer68_I_二叉搜索树的最近公共祖先 java版
原题链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/最初的想法:从这两个节点起找父结点,每次只有一个节点找父结点,如果找到的这个节点不是最近公共祖先就用父结点取代这个节点。循环,直到满足条件。错误=>没办法知道控制哪个节点等着哪个节点,才不会错过正好到最近公共祖先的位置,例如一个正好是另一个子树中的节点,那么这个子树根节点就得一直等着,但是我们不好判断谁该等着。换个思路
2020-11-25 15:16:42
85
原创 力扣刷题108将有序数组转换为二叉搜索树 java版
原题链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/最初的想法:怎么才能高度平衡呢?把数组二分。当数组不为空时建立一个root作为根。涉及到了递归,递归的终止条件是left == right也就是没有元素的时候,因为right是指向最后一个元素的下一个right-left==1代表含有一个元素。 递归以前先把这个节点建立了,作为参数传到递归函数里面,还要把父结点跟这个新节点连起来,依据用flag
2020-11-25 14:08:24
144
原创 力扣刷题701 二叉搜索树中的插入操作 java版
题目链接:https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/思路:插入的节点永远要插在叶子节点或者度为1的节点后面,关键就是要找到父结点看插在谁的后面,找到以后根据大小判断左右就好。 寻找父结点时,找到有位置放val的父结点即可,可以是叶子节点,也可以是val插入的地方正好是空的节点。package 二叉搜索树;/** * https://leetcode-cn.com/problems/insert-into-a-b
2020-11-25 11:17:57
115
原创 力扣刷题450. 删除二叉搜索树中的节点 java语言版
原题链接:450. 删除二叉搜索树中的节点最初的想法:删除一个节点,先是看这个节点存在与否,若存在则删掉。节点只指向左右节点而不指向父结点,那么要删除这个节点就得找到他的父结点,通过父结点找到他。所以父结点是否存在就可以分情况讨论了。 叶子节点删起来很简单,为此想到根据度的不同划分不同的删除模式。度为1,直接跨过它连下去就好,度为2比较麻烦,不好删除,所以转换思路,将他的后续或者前驱结点的值赋值过去,再把前驱或者后继节点删掉,间接删除了度为2的节点。深入思考:度为2的节点的前驱后续结点怎么删除呢?他们如
2020-11-24 17:44:48
140
原创 数据结构之动态数组
动态数组一些基本概念和细节内存管理的细节实现动态数组一些基本概念和细节1.数组中所有元素的内存地址都是连续的,基本所有编程语言的数组都是不能动态修改容量的,定义时就确定了大小。2.Java成员变量会自动初始化,int为0,对象为null。3.动态数组扩容的本质是开辟更大的空间把数组原来的内容拷贝过去,而不可能找到一段内存正好接在原来数组的后面。内存管理的细节对于动态数组而言,普通数组和对象数组的存储方式是有本质区别的,普通数组中存储的是数值本身,对象数组存储的是对象地址。清除普通数组时,只要si
2020-11-08 19:43:02
206
原创 王爽汇编_编译和链接
编译masm asm -> obj链接link obj->exe(通俗理解:编译是把很多.asm文件翻译成obj文件,链接是把所有的obj文件连接在一起得到最终的exe文件)exe文件包括整个程序和一些描述信息(内存和程序入口位置,OS根据这些信息分配内存和设置寄存器的值)源代码文件asm汇编指令 编译器翻译成机器指令,CPU执行伪指令 编译器执行符号体系 编译器执行assume 设置的依据debug t1.exe 跟踪翻译规则:字母数字开头的数字前面加0//以下是每次写
2020-11-01 13:37:00
169
原创 王爽汇编语言-栈
push入栈 将16位寄存器或者内存中的字型数据放在栈顶标记上面pop出栈 将栈顶标记所标识的字型数据存放在16位寄存器或者内存中(修改栈顶标记)只能操作字型数据在8086CPU中,在任意时刻将段地址寄存器SS和偏移地址寄存器SP所组合出来的内存地址当做栈顶标记push ax SP=SP-2 入栈pop bx SP=SP+2 出栈栈的设置(大小设置为16的倍数)eg 设置2000:0000-2000:0010为栈设SS为2000,SP为10H。原始栈和输入指令第一次push ax以
2020-11-01 10:34:09
235
原创 王爽汇编基础知识和寄存器基础
CPU执行010001…的机器指令,汇编指令可以被编译器翻译成机器指令。内存的最小单位是字节byte 1byte=8bit地址线:数量决定了CPU的寻址能力(能找到多大的地址)数据线:决定了CPU和其他部件进行数据传送时,一次性可以传送多少数据控制线:CPU对其他部件进行控制的能力eg.1.8080的地址总线宽度为16根,寻址能力为64KB。216=26×210{{2}^{16}}\text{=}{{2}^{6}}\times {{2}^{10}}216=26×210。2.8080的数据总线
2020-10-31 21:50:16
128
原创 二叉树的创建与遍历
根据扩展后的先序序列创建二叉树并进行三种常见遍历注意的点:1.构建二叉树时运用了C++中的引用,有点像地址,不需要返回值就可以直接修改实际参数的值,从而为创建的那个节点加入左右孩子。2.遍历时首先要判断是不是NULL节点,再进行后续操作。#include<iostream>#include<stdlib.h>using namespace std;typedef struct BiNode{ int data; struct BiNode *lchild,*rch
2020-10-24 17:03:41
107
原创 力扣刷题1021.删除最外层字符串
题目来源:https://leetcode-cn.com/problems/remove-outermost-parentheses/1021.删除最外层字符串1.问题描述2.思路分析3.代码注释4.总结收获1.问题描述(easy)有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。如果有效字符串 S 非空,且不存在将其拆分为
2020-10-15 21:18:40
344
原创 力扣刷题1002.查找常用字符
乍一想:创建三个字符数组,从第一个字符数组开始遍历。找到第一个字符数组的第一个字符,将其置A,遍历第二个第三个数组,看是否存在该字符,都存在则记录该字符,并且将二三个数组中的该字符置A。大概想一下是n三次方的复杂度,复杂度过高。另外,没有说字符串数组A有几个字符串,多了的话复杂度会更高。解题思路:新建一个26*3的数组,记录每个字符串中单词出现的频率填充数组,每列的最小值就是这个字符要打印的次数。...
2020-10-15 08:28:48
140
原创 支持向量机SVM相关代码 吴恩达机器学习第六次作业
高斯核函数(相似度函数)function sim = gaussianKernel(x1, x2, sigma)%相似度函数sim=exp(-sum((x1-x2).^2)/(2*sigma*sigma));end选择最优参数function [C, sigma] = dataset3Params(X, y, Xval, yval)C=1;sigma=0.3;params = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30];%参数列表min_error=0
2020-08-09 10:14:35
145
原创 机器学习算法误差分析 学习曲线分析 代码实现 吴恩达机器学习第五次作业
欠拟合图像样本很小时,训练集可以较好拟合,一旦样本变多,过于简单的直线无法拟合数据,误差变大。对于交叉验证集而言,样本变多拟合效果自然更好,但是最终趋于跟训练集误差基本相同,因为都有大量的数据点无法拟合。function [error_train, error_val] = learningCurve(X, y, Xval, yval,lambda)m_train=size(X,1);error_train=zeros(m_train,1);error_val=zeros(m_train,1)
2020-07-31 21:03:26
571
原创 神经网络 前向传播算法 反向传播算法 吴恩达机器学习第四次作业
随机初始化function theta = randInitializeWeights( num1,num2 )epsilon_init=0.12;theta=rand(num2,num1+1)*2*epsilon_init-epsilon_init;end前向传播算法和后向传播算法实现(为计算代价函数的倒数值),加入正则项function [J,grad] = nnCostFunction(nn_params, input_layer_size, hidden_layer_size,
2020-07-31 17:57:40
264
原创 多分类逻辑回归 吴恩达机器学习作业
思想:多分类拆成单分类问题,针对输入训练集拟合不同分类结果下的参数,选出假设函数最大的值即为最终分类。1.计算不同分类标准下的参数列表function [all_theta] = oneVsAll(X, y, num_labels, lambda);m=size(X,1);n=size(X,2);all_theta=zeros(num_labels,n+1);%10行 特征量个数+1列X=[ones(m,1) X];for i=1:num_labels initial_theta
2020-07-29 17:55:24
156
原创 吴恩达机器学习 逻辑回归作业 正则化逻辑回归 决策边界绘制
观察原始数据分布function plotData(X,y)figure;%一种类别一种画法 one=find(y==1)zero=find(y==0)%返回类别为0的下标plot(X(one,1),X(one,2),'rx','MarkerSize',10);hold on;plot(X(zero,1),X(zero,2),'ro','MarkerFaceColor','y','MarkerSize',10);%填色操作end计算代价函数,求导function g = s
2020-07-29 15:00:43
720
1
原创 吴恩达机器学习 多变量线性回归作业/学习笔记
特征缩放 须返回均值和标准差,因为在预测时,要对输入的数据进行相同的特征缩放才能预测function [ X_norm ,miu,sigma] = featureNormalize( X )%两个特征值的数值相差很大 特征缩放X_norm=X;miu=zeros(1,size(X,2));sigma=zeros(1,size(X,2));miu=mean(X,1);%求均值sigma=std(X,0,1);%求方差%对 仍然局限于两个特征值% X(:,1)=(X(:,1)-miu(1)..
2020-07-25 22:36:08
150
1
原创 吴恩达机器学习 单变量线性回归作业
计算代价函数function J = computeCost( X,y,theta) %X为设计矩阵 m行2列 第一列为1,第二列表示特征量x theta为2*1矩阵m=length(y)%m为样本数%X*theta结果为m*1矩阵,每一行代表一个样本的预测值%-y结果为与真实值的差值J=sum( (X*theta-y).^2 )/(2*m)end梯度下降法迭代thetafunction [ theta,J_history ] = gradientDescent(X, y, theta
2020-07-25 18:55:15
184
原创 opencv图像量化 减色处理
原图像的值是0-255,设置新图像的值为0~3,注意三个通道都要量化。程序简单但踩了不少坑,Mat的 at函数很麻烦,要注意一旦出现赋值操作,必须与定义时的数据类型一致。另外,在调试过程中出现了height变量触发异常的情况,修改了属性中的堆栈大小,将图片像素改小都无果,发现单步调试下只有将height变小才能运行,最后换了一张图片竟然好了,难道boy.jpg携带bug吗。#include <opencv2/core.hpp>#include <opencv2/highgui.hpp&
2020-07-23 20:20:34
864
原创 opencv RGB与HSV转化
HSV和RGB都是表示色彩的方式。H为色相,S为饱和度,V为明度,RGB代表红绿蓝三种颜色分量。色相:用0-360度表示颜色。饱和度:色彩纯度,越低颜色越暗淡,范围0~1。明度:色彩明暗度,越高越亮越接近白色,越低越暗越接近黑色,范围0~1。转化公式如下:从RGB到HSV从HSV到RGBRGB和HSV按照公式进行转化,但是要注意r,g,b的范围要从0255变成01参与计算,最后的结果,HSV为float类型,RGB为uchar类型要互相转化。#include <opencv2/c
2020-07-23 16:48:21
2813
原创 opencv大津算法二值化
二值化的前提是灰度化,手动二值化需要不断进行调整,找到合适的阈值,大于阈值为白色。大津二值化又叫最大类间方差法,可以自动确定二值化的阈值。基本思想是遍历阈值,当某个阈值下分割的两类像素点之间灰度方差最大的时候,就是最优的阈值。(因为类间方差越大,两类的差别越大,不管是前景错分到背景还是背景错分到前景都会使类间方差变小)。数学推导如下:#include <opencv2/core.hpp>#include <opencv2/highgui.hpp>#include <i
2020-07-23 15:21:07
1214
原创 opencv RGB转灰度图
RGB转灰度图主要是通过各颜色分量取适当权重求和实现的,比例有很多种,比例不合适往往会出现某种颜色分量的细节无法显示的情况,恰当比例的灰度图很逼真。#include <opencv2/core.hpp>#include <opencv2/highgui.hpp>#include <iostream>cv::Mat BGR2GRAY(cv::Mat img) { int width = img.cols; int height = img.rows; cv
2020-07-23 14:00:58
1570
原创 opencvRGB通道变化
imread函数读入的Mat图像是BGR类型的,也就是第一个通道是blue。可以用out.at函数直接对像素点进行操作,操作结果存入事先定义的Mat中。#include <opencv2/core.hpp>#include <opencv2/highgui.hpp>#include <iostream>cv::Mat channel_swap(cv::Mat img) { int width = img.cols; int height = img.row
2020-07-23 13:40:19
363
原创 7-1最大子列和问题
最近在粗略的浏览《大话数据结构》这本书,回顾了大二学习的内容。大胆承认,我真的不理解为什么要学习数据结构这门课,为什么大厂招程序员,研究生面试什么的,都很看重这个。所以想从题目入手,慢慢体会数据结构在解题中的作用。看到最大子列和问题,我模模糊糊觉得,自己的笨办法时间复杂度太高,一定有某种数据结构和算法可以解决的,可是我又不知道是什么。初步想法:若数列存在正数,连续子列的首尾元素不可能负数,因为去掉他们一定更大。如果前几个数和为负数,则不用继续累加,因为相当于负数开头。网络上有分治法和在线处理(动态规划)
2020-05-16 17:33:05
302
原创 哈夫曼编码的MATLAB实现
在手动计算时,对哈夫曼编码的流程还是非常熟悉的,所以难点就是代码实现。在实现以前,我考虑了以下一些问题:一个符号的哈夫曼编码值可以用一个向量进行存储,符号合并以后的结果用什么表示,对其赋值0,1如何作用在被合并的原始符号上面。sort函数的用法:[B,I]=sort(A)如果 A=[5 4 7 0 2 ]B=[0 2 4 5 7]I=[4 5 2 1 3]是排序以后的数在原序列中的位置...
2020-04-25 16:50:24
7181
4
原创 线性分组码的编码译码
线性分组码是通信原理中已经学到的一个概念,为了更好的编写代码,我又重新回顾了一次线性分组码的概念,网上的概念大多很乱,下面我进行一个梳理。以(7,4)汉明码为例:(7,4)汉明码的来历:在信息位后面增加监督码元,可以指示错误码元的位置。(7,4)汉明码信息位为4位,监督位为3位,监督位有2^3=8种组合。如果只错一位,则可用其中一种表示无错,其余7种表示错码可能的7个位置,见下表。根据码元错...
2020-04-25 16:38:56
11288
3
原创 信道容量迭代算法
啦啦啦啦,开始菜鸟的第一篇博客。这次的实验对我来说真是太艰难了,一部分因为对信道容量的计算方式本身就不熟,一部分原因是不太看得懂算法流程的意思,另一部分原因就是对MATLAB的矩阵运用不熟练。网上找的代码很多,但是没有什么解析,而且有的太繁琐,有的错误比较多。信道容量和输入概率分布与信道转移概率有关,本次实验转移概率固定,是要求最佳输入概率分布。求信道容量就是求平均互信息量的最大值。在循环过程...
2020-04-19 19:33:08
7114
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人