js变量、作用域、内存
原始值和引用值原始值就是最简单的数据类型,而引用值就是对象。
原始值不能有属性,尽管给原始值添加属性不会报错
let name = 'Nicholas';name.age = 27;console.log(name.age);//undefined
原始值赋给另一个值时,会在内存中复制一份,因此两份互不干扰let num1 = 5;let num2 = num1;num1 = 3;console.log(num2);//5
把引用值从一个变量赋给另一个变量时,实际上是复制了指向这个对象的指针(对象本身在堆中),因此一个变量对对象进行修改另一个也会修改。
js函数只存在值传递,也就是说参数是原变量复制一份传进去的,也就是说如果传递的是对象我们在函数中修改了对象的属性在函数外也是成立的。
function setName(obj){ obj.name = 'b';}let person = new Object();setName(person);console.log(person.name);//b---function ...
vi
启动vi语法: vi [-rR] [file…]
如果用vi启动了一个不存在的文件,那么他将新建这个文件。如果只输入vi,那么他将在当前文件夹下创建一个空文件
-R 以只读模式启动
vim是vi的进阶版本
语法: vi -C [-rR] [file…]
-C是兼容模式,它将尽可能的和vi保持一样
命令模式和编辑模式当使用vi时,存放数据的区域叫做编辑缓冲区(editing buffer),如果想编辑文件,那么vi就将文件的内容复制到缓冲区中,然后再缓冲区中编辑。因此处理的其实是文件的副本。
在命令模式中,输入的一切字符都是命令。例如,在命令模式中,单个字母x就是删除一个字符。dd就是删除整行的命令。
第二种模式就是输入模式。这种模式下,任何内容都会输入到缓冲区中。
在启动过程中,vi完成三件事情。将文件中的内容复制到编辑缓冲区,将光标定位到缓冲区第一行的开头。最后vi进入命令模式。
数据的恢复和关闭vi当使用vi时,数据会保存在编辑缓冲区内,因此当程序非正常终止时,临时文件依然存在。使用-r(recovery)就可以重新打开缓冲区
如果需要先保存再退出,使用的命令时ZZ,即先按下shi ...
MPI编程
简介MPI是一种编程规范,它的实现是一个库,主要在Fortran和c语言上实现。它的目的是实现进程间通讯。
MPI基本函数开始与结束
MPI_Init(&argc, &argv): 利用输入进来的参数进行初始化
MPI_Finalize(): MPI终止时调用
#include <stdio.h>#include <mpi.h>void main (int argc, char * argv[]){ int err;err = MPI_Init(&argc, &argv); printf("Hello world!\n"); err = MPI_Finalize();}运行mpirun -n 4 ./hello.c
身份标识
MPI_COMM_WORLD: 获得通信域(也就是同一组内的进程,例如上面mpirun -4代表启动4个进程,他们属于同一组)
MPI_Comm_size(MPI_COMM_WORLD, &size): 获得进程个数,赋值给size
MPI_ ...
字符串之trie树(字典树)
作用字典树作用正如其名,就是用来找字符串的。先给你一堆字符串作为字典,然后给其他字符串看这些字符串是否在开始给的字符串里,可能对于这种情况首先想到的便是map,但map查找效率十分低下,碰到大量的数据时很容易TLE,于是字典树便到了我们眼前
基本它实际上就是一个树,类似于求前缀码,用第一层表示第一个字母,第二层表示第二个字母,以此类推,而每个字母不一定都有,这样便减小了搜索所需时间
在计算机中,trie树可以用一个二维数组a[i][j]来表示。第一个元素i另外还有一个问题是这么多单词,怎么知道这个单词是不是终点呢?,可以通过insert函数中的ch[u][c]=sz++;来判断,如果等于一,则说明这是终点,
代码实现:
模板#include<bits/stdc++.h>#define CLR(x) memset(x,0,sizeof x)using namespace std;const int maxnnode=1000;const int maxn=1000;//字母表为全体小写字母的Trie struct Trie{ int ch[maxnnode][ ...
html元素
仅是记笔记,没有考虑格式。
title: 几乎所有元素都可以插入,代表提示信息。id: 元素的标识,可以用于定位<html></html> 表示这是一个html<title></tilte> 网页标题<head></head>: 头部<body></body> 主体<p></p> 段落<h1></h1>,<h2></h2> 文章内部标题<a href = "link..." title=" ..." id="..." target=" "> ...</a> a元素可以让一个页面跳转到另一个页面(链接),href指定了目标文件,link代表的就是链接,如果使用相对目录,那么根目录就是当前html所在目录,可以用.. 返回上级目录。可以直接在link后加一个#... ,之后会直接跳转到#锁指向的位置(作用和id一样).t ...
加法溢出和乘法溢出
无符号数加法便是两个数相加,如果超过最大值那么就截断超过的位数。截断超过的位数也就相当于mod2^n,因为这样做超过的位都会被模去变成0.
有符号数加法相对复杂。先是变成无符号数加法,加完 之后再按有符号数编码去理解,这样就会产生两种溢出,正溢出和负溢出。
首先,如果两个数一正一负,则不可能产生进位。
正溢出很好理解,最高一位为符号位,假如两个正数一加,超过了最大值,那么第2^w-1位就会变成1,这一位是符号位,因此这个数字便会变成负数。
如果是负溢出,因为两个数最高位一定为1,如果2^w-2位没有发生进位的话,那么就产生了溢出,此时最高位为0,变成正数
例如:10111111+10111111(-65)=01111110(126)
所以说如果是正数溢出,则需要-2^m,如果是负溢出,则需要加上2^m
判定是否发生溢出s=a+b;if((a>0==b>0)&&(a<0!=s<0)){ cout<<"发生溢出"<<endl;}else{ cout<<& ...
javascript
参考自
对象及函数对象创建对象对象直接使用键值对的方式进行定义var xiaoming = { name: '小明', birth: 1990, school: 'No.1 Middle School', height: 1.70, weight: 65, score: null age: function () { var y = new Date().getFullYear(); return y - this.birth; } 'middle-school': 'No.1 Middle School'};xiaoming['middle-school']; // 'No.1 Middle School'xiaoming.age();如果键时字符串的话必须使用[]的方式进行访问,例如middle-school
如果想判断某个属性是否在这 ...
OpenMP并行编程
基础OpenMP是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程模型。它支持c++, c, Fortran语言。
它在最开始的时候只有主线程,在需要的时候又可以分出多个线程进行计算,计算完毕之后又可以变成一个线程。
它的头文件是omp.h
一个例子:#include <omp.h>int main(){ double res[1000]; #pragma omp parallel for for(int i=0; i<1000; i++) { do_huge_comp(res[i]); }}
编译制导语句同步与作用域
#pragma omp master: 表明该区域只能由主线程执行
#pragma omp critical (name): 临界区,一次只能由一个线程执行
#pragma omp barrier: 用来同步所有线程,先到达的会等待,直到所有线程到达
#pragma omp atomic: 表明该语句是原子指令
#pragma ...
GPU编程
GPU结构每个GPU中有若干个GPC(图形计算簇),每个GPC中又有若干个TPC(Texture Processing cluster), 每个TPC中有若干个SM(Stream Multiprocessor),每个SM中有若干个block,在block中有各种各样的核和寄存器。
在GPU编程中,通常把cpu称作host,把gpu称作device。
计算过程:
数据从cpu拷贝到gpu显存中
加载GPU程序并运行
将运行完后的数据又送回CPU中
CUDA编程基本结构:malloc();cudamalloc(); //分配显存cudaMemcpy(): //将内存中的内容放到显存中kernelName<<<gridSize, blockSize>>>(input_params);//计算过程,input_params是运行的函数cudaMemcpy();cudaFree();
例如:__global__ void add(int *a, int *b, int *c){ *c = *a + *b;}int main(v ...
java 集合,列表,队列,映射
概念
Set(集),集合中对象不以特定方式排序(有的实现类可以),没有重复元素
List(列表),按照索引排序,可以有重复对象。List和数组类似。
Queue(队列),先进先出
Map(映射): 有键值对。没有重复键对象,可以有重复值对象
定义:
Set<String> set = new HashSet<String>();
Collection 和 Interator接口Collection声明了上面这些数据结构(不包含map)通用的方法。
方法
描述
boolean add(Object o)
加入对象
void clear()
删除所有对象
boolean contains(Object o)
判断集合中是否有特定对象
boolean isEmpty()
Iterator iterator()
返回一个Iterator对象(迭代器)
boolean remove(Object o)
int size()
返回数目
Object[] toArray()T[]toArray(T[] a)
返回一个数组,包含 ...