自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入理解计算机系统(七)

6.2 局部性局部性原理 :倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。时间局部性 :被引用过一次的内存位置很可能在不远的将来再被多次引用。空间局部性 :一个内存位置被引用了一次,很可能在不远的将来引用附近的一个内存位置。硬件层面 ,局部性原理允许计算机设计者通过引入称为 高速缓存存储器 来保存最近被引用的指令和数据项,从而提高对主存的访问速度。操作系统层面 ,局部性原理允许系统使用主存作为虚拟地址空间最近被引用块的高速缓存。6.3 存储器层次结构6.3.1

2021-10-16 21:49:18 179

原创 深入理解计算机系统(六)

访问主存数据流通过称为 总线(bus) 的共享电子电路在处理器和DRAM主存之间来来回回。每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为 总线事务(bus transaction)。读事务(read transaction) 从主存传送数据到CPU。写事务(read transaction) 从CPU传送数据到主存。计算机系统的主要部件有CPU芯片、IO桥接器(芯片组,包括内存控制器),以及组成主存的DRAM内存模块。当CPU执行如下读事务会发生什么?movq&nbsp.

2021-10-07 12:00:41 308

原创 深入理解计算机系统(五)

第六章 存储器层次结构6.1 存储技术6.1.1 随机访问存储器随机访问存储器(Random-Access Memory, RAM)分为两类,静态的和动态的。静态RAMSRAM将每个位存储在一个双稳态的(bistable)存储器单元里。所谓双稳态,就是存在两个稳定状态,其余状态都是不稳定,会迅速转移到两个稳定状态中的一个。由于SRAM存储器单元的双稳态特性,只要有电,它就会永远地保持它的值。即使有干扰来扰乱电压,当干扰消除时,电路就会恢复到稳定值。动态RAMDRAM将每个位存储位对一

2021-10-01 00:46:36 186

原创 深入理解计算机系统(四)

第三章 程序的机器级表示3.2 程序编码3.2.1 机器级代码对于机器级编程来说,有两种抽象尤为重要。第一种是由指令集体系结构或指令集架构(Instruction Set Architecture,ISA)来定义机器级程序的格式和行为,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。第二种是机器级程序使用的内存地址是虚拟内存地址,提供的内存模型看上去是一个非常大的字节数组。程序内存包含:程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的内存块(比

2021-09-24 11:41:00 391

原创 深入理解计算机系统(三)

2.2.4 有符号数和无符号数之间的转换2.2.6 扩展一个数字的位表示要将一个无符号数转换为一个更大的数据类型,在表示的开头加0。这种运算被称为零拓展。要将一个补码数字转换为一个更大的数据类型,在表示的开头加1。这种运算被称为符号拓展。2.2.7 截断数字对于无符号数,x_1 = x mod 2^k对于补码,x_1 = x mod 2^k,再将(无符号数) x_1 转换为补码。2.4 浮点数2.4.2 IEEE浮点表示2.4.4 舍入向偶数舍入 :将数字向上或者向下舍入,使得结果

2021-09-19 16:55:38 111

原创 深入理解计算机系统(二)

第二章 信息的表示和处理2.1 信息存储2.2.2 无符号数的编码无符号数的编码的定义如下:2.2.3 有符号数的编码——补码编码有符号数就是第一位为符号位,后面的都为有效位。计算机中最常见的对有符号数的编码就是用补码。补码编码的定义如下:对于正数和0而言,符号位都为0,所以其补码也是原码本身。对于负数而言,符号位为1,有效位为2^w - abs(x)。2^w = 有效位权重和 + 1,且一个数的取反本质就是所有位的权重和 - 这个数,所以补码的有效位 = 原码的有效位取反 + 1。例如-

2021-09-13 00:23:55 100

原创 深入理解计算机系统(一)

第一章 计算机系统漫游1.1 信息就是位 + 上下文计算机中信息其实都是由0和1所组成的串,0和1就是比特,也叫位。而计算机为了识别这些01串所表达的意思,也就需要区分不同数据对象,唯一的方法就是靠数据对象的上下文。1.2 程序被其他程序翻译成不同的格式预处理阶段:预处理器(cpp)识别以字符 # 开头的命令。比如导入头文件时,将头文件中的文件内容插入程序文本中,得到以 .i 作为文件拓展名的文件。编译阶段:编译器(ccl)将 .i 文件翻译成 .s 文件,此时为汇编程序。汇编阶段:汇编器(

2021-09-05 20:51:40 388

原创 Bellman-Ford

#include<iostream>using namespace std;const int maxn = 1000;const int maxe = 100000;typedef struct Edge { int u, v; // 起点,终点 int weight; // 权值}Edge;Edge edge[maxe]; // 保存边的值int dist[maxn]; // 结点到顶点的最小距离int nodenum, edgenum, source

2021-08-29 19:04:31 91

原创 ASM方法分析

数据流分析数据流分析包括:对于一个方法的每条指令,计算其执行帧的状态。有两种类型的数据流分析可以执行:正向分析是指对于每条指令,根据执行帧在执行此指令之前的状态,计算执行帧在这 一 指令之后的状态。反向分析是指对于每条指令,根据执行帧在执行此指令之后的状态,计算执行帧在这 一 指令之前的状态。控制流分析控制流分析包括计算一个方法的控制流图,并对这个图进行分析。...

2021-08-22 00:51:01 197

原创 LeetCode 300:最长递增子序列

LeetCode 300:最长递增子序列题目描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例1输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例2输入:nums = [0,1,0,3,2,3]输出:4示例3

2021-08-12 11:00:22 176 2

原创 代理(静态代理与动态代理)、Hook

本文大量运用了Java反射,没了解过的可先看一下:https://blog.csdn.net/Kiefer_lin/article/details/118867193?spm=1001.2014.3001.5501代理(Proxy)代理是一种常用的设计模式,其核心就是代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。分为静态代理和动态代理。举一个例子讲清楚什么是代理?你在租房子的时候,由于自己掌握的资源不够,为了租到比较适合自己的房子,你就需要找中介(代理)帮你

2021-08-04 22:34:24 232

原创 Android四大组件及变异测试

ActivityActivity就是用户与应用程序互动的界面。Activity总共有6种状态,Created, Started, Resumed, Paused, Stopped, Destroyed。与此同时,有以下7个回调函数使得其状态发生转换。onCreate()该方法是在Activity第一次被创建的时候被调用,并且只会调用这一次,之后不会再调用。调用前后:Created -> StartedonStart()系统调用该方法时,Activity对用户可见,应用会为 Activ

2021-07-31 19:22:26 811

原创 Activity与Fragment互传数据

Activity与Fragment首先需要明确的是,Activity与Fragment是多对多关系。一个Activity中可以有多个Fragment,一个Fragment也可以存在于多个Activity中。Activity向Fragment传递数据跟Activity之间的互传数据一样需要通过Bundle对象作为载体进行传递。Fragment可以通过有参构造函数的参数接收Activity传来的数据。public AFragment(String s) { Bundle bundle =

2021-07-24 23:47:19 3695

原创 初识java反射

什么是反射反射,也就是在运行时将类中的各个组成部分封装为其他对象。这句话有点抽象,难以理解,想要理解这一句话,我们需要理解Java代码在计算机中经历了什么。Java代码在计算机中经历的三个阶段Source源代码阶段程序员写好一个.java文件,通过javac编译命令,产生.class文件,这个文件就是所谓字节码文件,里面存放的都是二进制数据,只有JVM可以读懂。Class类对象阶段JVM中有一个类加载器,可以将.class文件加载到内存中,并产生一个Class类对象,Java中,每个类只有一

2021-07-18 01:36:40 151

原创 内部排序——堆排序

堆堆是一棵特殊的完全二叉树,分为小顶堆和大顶堆。小顶堆就是每个节点的值都小于等于其左右子节点的值,所以对于一个小顶堆,其根节点是整棵树的最小值。堆排序以小顶堆为例,利用堆的特性(每个节点的值小于等于其左右子节点的值)就可以对一个数组进行排序。首先,堆是一棵完全二叉树,所以我们需要将一个数组建成完全二叉树。对于一棵树,我们需要的是能够获得每个节点的父节点及其左右子节点,而对于一棵完全二叉树,将一个数组从下标为 1 开始存储,这样之后可以发现,节点 i 的左子节点的下标为 2 * i, 右子节点的下标为

2021-07-09 19:55:46 152

原创 异或最大值

题目描述给定一些数,求这些数中两个数的异或值最大的那个值输入多组数据。第一行为数字个数n,1 <= n <= 10 ^ 5。接下来n行每行一个32位有符号非负整数。输出任意两数最大异或值样例输入3379样例输出14解题思路首先最暴力的办法就是直接套两层循环,每一个数都跟其他数进行异或,进而找出异或最大值,这是个O(n^2) 的算法,显然是不行的。既然不能每个数都跟其他数去异或,那是不是可以尝试直接让每个数跟(n-1)个数中的某个对应的数进行异

2021-07-02 22:14:21 2110

原创 Painting in AWT and Swing

惨痛背景在模仿网上做贪吃蛇小游戏时,由于网上源码用的是AWT,而我用的是Swing,对于painting我也一知半解,导致绘图出现各种奇怪的现象。我用Swing重写了update()和paint()(像AWT那样),update()白写没调用是一回事,paint()少写了super.paint()导致了一系列bug。于是我在官网上找到文章Paint in AWT and Swing ,有了以下总结。重量级组件和轻量级组件“heavyweight” means that the componen

2021-06-23 16:56:05 142

原创 Java网络编程基础

网络编程网络编程模型主要由C/S(Client/Server),B/S(Browser/Server)两种结构。而网络编程中有两个主要的问题,一是如何定位网络上的主机,二是如何数据传输时如何做到可靠与高效。为了解决这两个问题,相互通信的计算机就必须遵循一定的网络协议,较为广泛使用的是TCP/IP和UDP/IP。Java–使用ServerSocket和Socket开发TCP/IP网络程序Java提供了Socket和ServerSocket两个类,分别用来表示双向连接的Client和Server。服务

2021-06-18 13:40:49 195 2

原创 负环——spfa

#include<iostream>#include<cstdio>#include<queue>#include<algorithm>#include<cstring>using namespace std;const int maxm = 3e3+5, maxn = 2e3+5;const int INF = 0x3f3f3f3f;struct edge{ int v, w, next;}e[maxm<<1];

2021-03-29 01:01:37 72

原创 二叉树——求先序和后序

已知中序,后序求先序#include<iostream>#include<cstdio>#include<string>#include<sstream>using namespace std;int in[100], post[100];int n;bool read_list(int *a) { string s; if(!getline(cin, s)) return false; stringstream ss(s);

2021-03-29 00:51:59 207

原创 图论——链式前向星

概述链式前向星是解决图论的一种方法,一开始接触会有点绕,但是真的好用!首先要有个意识,这个方法的出发点是以边为核心建结构体,这个结构体有一个很妙的变量next,是用来存同一起点的上一条边的编号。除了结构体之外,再建一个head数组,head[i]存的是i作为起点的最后一条边的编号。通过next和head的结合,可以巧妙地进行存边、遍历等操作。结构体建结构体时应注意,如果题目给了m条边,应该结构体数组应该2*m个空间(因为双向)。struct Edge { int v, w, next;}e

2021-03-10 14:59:09 161

原创 背包问题

01背包int v = {0, 1, 2, 3, 4};//valueint w = {0, 1, 2, 3, 4};//weightint func(int k, int c) {//k种物品,背包容量为c for (int i = 0; i <= k; i++) { for (int j = c; j >= w[i]; j--) ans[j] = max(ans[j], ans[j - w[i]] + v[i]); } return ans[c];}完全背包

2021-03-02 23:25:35 64

原创 最小生成树——prim

简述prim和Kruskal都是解决最小生成树的算法,Kruskal主要用于解决顶点多但边稀疏的图,prim主要用于解决边稠密的图。c++ll prim(int n) { memset(vis, 0, sizeof(vis)); for(int i = 1; i <= n; i++) { d[i] = e[1][i]; } vis[1] = 1; ll ans = 0; for(int k = 2; k <= n; k++) { int x, m = INF; fo

2021-03-02 00:37:19 99

原创 多源最短路径——Floyd算法

c++代码用d[i][j]表示节点i与j之间的距离。void Floyd() { for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(i == j) d[i][j] = 0; else d[i][j] = INF;//注意INF的大小,防止下面加法时溢出 } } for(int k = 0; k < n; k++) { for(int i = 0; i < n; i++) {

2021-02-16 15:06:40 68

原创 最小生成树——Kruskal

简述给定一个带权值的无向图,最小生成树就是求出一棵树满足包含所有节点,并且使得树的边的权值和最小。Kruskal算法思想是将给定边按权值从小到大排序,利用并查集的思想(如不了解并查集可先看下面的介绍),将节点逐次合并到同一个集合。并查集并查集可以简单拆分为合并、查询集合。所谓合并就是当两个不同集合中的两个元素有关系时,我们可以将这两个集合合并为一个集合。而查询就是我们可以查询两个元素是否在同一个集合。并查集通常使用一个数组f表示每个元素的父元素,然后编写Union函数改变数组f中元素的值,若两个元素

2021-02-16 11:29:48 128

原创 单源最短路径——Dijkstra

简述单源最短路径是图论的一种典型应用,给定n个顶点(包括一个源点)以及一些顶点间的权值,求各个顶点到源点之间的最小的权值和,即最短路。c++代码用vis标记访问过的顶点,d[u]表示顶点u到源点之间的距离,w[u][v]表示连接顶点 u 和 v 的边的权值。void Dijkstra() { memset(vis, 0, sizeof(vis)); d[0] = 0; for(int i = 1; i < n; i++) { d[i] = INF; } int t = n; w

2021-02-16 10:59:09 170

原创 快速排序

基本思想快速排序,简称快排。升序排序是通过选定一个基准点,这个基准点可以选最中间元素或者是第一个元素,将比这个基准点小的元素放在左边,大的元素放在右边,实现基准点左边的元素小于等于基准点的值,右边的元素大于等于基准点的值(只是将元素放在两边,并不是有序的),然后分别递归左边和右边逐步实现排序。C++代码void quick_sort(int left, int right, int a[]) { //以第一个元素为基准点 int t = a[left], l = left, r = righ

2021-02-09 23:14:48 99

原创 欧拉筛(线性筛)

欧拉筛欧拉筛是一种线性筛,作用是线性地找出小于等于N的质数。直接看代码理解!void oula(int N) { for(int i = 2; i <= N; i++) { if(!vis[i]) prime[cnt++] = i; for(int j = 0; j < cnt && i*prime[j] <= N; j++) { vis[i*prime[j]] = 1;

2021-02-09 17:40:21 889

原创 快速幂运算

快速幂运算直接举例说明!计算2^9, 从9的二进制1001可以将式子化简为2^9 = 2^8 * 2^1 我们按照这个思路进行计算。也就是说我们每一次都计算并保存2^x, 这个x的取值为1,2,4,8……,然后我们的答案ans每次都判断是否乘上这个数。第一次运算2^1, 而9的二进制1001最后一位为1,所以ans * 2^1; 第二、三次运算22、23, 1001的倒数第二、三位为0,所以直接跳过;第四次运算2^4,1001的倒数第四位(第一位)为1,ans * 2^4, 得到最终答案。正常的幂运算需要

2021-02-09 17:10:54 534 1

原创 set以及set的典型运用

set概述set是根据元素值进行排序的集合,且集合中不存在重复元素。set是由二叉搜索树实现,且对树进行了平衡处理,使得元素在树中的分布较均匀,所以set中的插入、删除以及搜索操作的复杂度都是O(logn)。set常用成员函数begin() – 返回指向set开头的迭代器end() – 返回指向set末尾的迭代器size() – 返回set中的元素总数clear() – 清空set中所有元素erase(x) – 删除含有x的元素insert(x) – 插入元素xfind(x) – 搜索与

2021-02-09 16:33:28 365

原创 并查集——糖果

题目描述链接:https://ac.nowcoder.com/acm/contest/9983/G来源:牛客网在一个幼儿园里面有 n 个小朋友,分别编号 1,2,…,n。在这些小朋友中有一些小朋友互为朋友关系,总共有 m 对朋友。作为幼儿园老师,你想买一些糖果分给小朋友,你知道第 i 个小朋友想要至少 a[i] 个糖果,否则他就会不开心。同时,如果一个小朋友得到的糖果数小于他某个朋友得到的糖果数,他也会不开心。请问你最少买多少糖果才能保证每个小朋友都不会不开心呢?输入描述第一行以空格分隔的两个整数

2021-02-08 11:38:52 165

原创 双端队列——牛牛与交换排序

牛牛与交换排序题目描述输入描述输出描述解题思路解题技巧c++代码题目描述链接:https://ac.nowcoder.com/acm/contest/9982/F来源:牛客网牛牛有一个数组,数组元素是1到n的排列,即数组的值在1~n范围内,且每个数字仅出现1次。牛牛想要将该数组变为升序排列的,他可以进行如下的操作。首先他要确定一个长度k,k的范围在1~n之间。接下来他将会进行若干次操作。在每轮操作中他都可以选择一段长度为k的子数组,然后进行区间的翻转操作。他可以做任意次数的操作,但是要求他每

2021-02-06 11:56:54 261

空空如也

空空如也

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

TA关注的人

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