- 博客(328)
- 资源 (1)
- 收藏
- 关注
原创 手把手用keras分类mnist数据集
实战流程获得数据,并将数据处理成合适的格式按照自己的设计搭建神经网络设定合适的参数训练神经网络在测试集上评价训练效果一、认识mnist数据集from keras.utils import to_categoricalfrom keras import models, layers, regularizersfrom keras.optimizers import RMSprop...
2020-04-29 19:11:44 30322 29
原创 分门别类刷PAT甲级
\quad博主正在准备PAT考试中,已经刷完一次甲级题,现将PAT155道甲级考试题分门别类罗列出来,再刷一次,这样刷能让自己对每种类型的题有一个综合的认识,进一步提升。欢迎大家加我QQ:1613511883一起探讨一、模拟题1、字符串处理2、模拟3、进制转换4、图形输出5、查找元素...
2019-08-19 17:25:05 2451
原创 社区发现算法之——Louvain
1、什么是社区如果一张图是对一片区域的描述的话,我们将这张图划分为很多个子图。当子图之内满足关联性尽可能大,而子图之间关联性尽可能低时,这样的子图我们可以称之为一个社区。2、社区发现算法及评价标准社区发现算法有很多,例如LPA,HANP,SLPA以及我们今天的主人公——Louvain。不同的算法划分社区的效果不尽相同。那么,如何评价这些算法孰优孰劣呢?用模块度modularity来衡量。模...
2018-10-25 09:13:39 24690 224
原创 跳表(SkipList)的c++实现和性能测试
\quad跳表的理论参考这个PPT,本文主要介绍跳表的实现,以及跳表的性能随着概率因子变化而变化的情况,从而发现最优概率因子的范围。一、跳表的实现\quad跳表节点需要两个指针,一个指向右侧节点,一个指向下方节点,节点定义如下:struct Node{ int val; Node *next; // 右边节点 Node *down; // 下方节点 Node(int x){ val = x; next = down = NULL;
2022-02-28 16:25:57 1839
原创 红黑树笔记
0、2-3树满足二分搜索树的基本性质节点可以存放一个元素或者两个元素,分别称为2节点和3节点2-3树绝对平衡2-3树的插入:假设依次插入42,37,12,则首先创建一个节点42,37来之后会和42节点合并形成一个3节点,12来后会先暂时和42,37形成节点[12,37,42],然后进行分裂,37为根,12为左子树,42为右子树红黑树和2-3树的等价性:所有红色节点向左倾斜1、红黑树特性红黑树是一颗二叉搜索树根节点是黑色(2-3树中两种节点显然易得)叶子节点(空节点)是黑色红
2021-07-31 21:50:11 400
原创 操作系统知识点
1、进程的状态阻塞:进程在等待某个外部信号,例如等待读取磁盘完成运行:进程在执行程序就绪:进程在排队等待执行运行和就绪可以互达;运行可以到阻塞,阻塞不能直接到运行;阻塞可以到就绪,就绪不能到阻塞。2、调度问题当多个进程或线程竞争cpu导致2个及以上进程或线程处于就绪状态,需要等待操作系统的调度。调度需要完成以下问题:新任务何时执行任务临时终止如何选择下一个任务任务阻塞如何选择下一个任务发生中断时如何响应调度的通用目标:公平——每个进程公平的分享cpu份额,或者根据给定的优先
2021-07-31 10:40:13 1310
原创 面试经典问题总结
一、Java类加载过程一个java文件从编码完成到最终执行,一般包括两个过程:编译:将写好的Java文件,通过javac命令编译成字节码,即.class文件运行:将编译生成的.class文件交给JVM执行类加载过程:JVM把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程。JVM不是一开始就把所有的类都加载进内存中,而是只有第一次遇到某个需要运行的类才会加载,且只加载一次。类加载分为三部分:加载、链接和初始化。其中链接又分为三小部分:验证、准备和解析。1.加载。
2021-07-15 18:56:45 375
原创 JVM调优
一、编译器自带的优化1、方法内联将方法展开,避免频繁调用函数,每次调用函数就会创建一个栈帧,消耗资源。是否内联需要满足以下条件:热点方法:如果方法体小于325字节会尝试内联,可以使用-XX:FreqInlineSize修改大小非热点方法:如果方法体小于35字节会尝试内联,可以使用-XX:MaxInlineSize修改大小被调用方法运行时的实现可以被唯一确定public class InlineTest { public static void main(String[] args)
2021-07-08 20:23:56 377
原创 求n个数组(字符串)的最长公共子串
给定n个数组,求这n个数组的最长公共子串的长度,例如:paths = [[0,1,2,3,4], [2,3,4], [4,0,1,2,3]]的最长公共子串为[2,3],长度为2。这类问题可以使用字符串hash来解决,首先是二分最长公共子串的长度。对于每个二分的长度,都去check是否存在该长度下的解。hash的主要目的是在O(1)时间得到每个数组的每个子串的hash值,这样就可以判断在相同长度下是否存在某个hash值在每个数组中都存在,即包含相同长度的子串。typedef unsigned lon
2021-07-04 21:47:25 1890
原创 shopee 2021秋招部分笔试题汇总
1、Leetcode13 罗马数字转整数class Solution {public: int romanToInt(string s) { int n = s.size(); unordered_map<string, int> mp; mp["I"] = 1, mp["V"] = 5, mp["X"] = 10, mp["L"] = 50, mp["C"] = 100, mp["D"] = 500, mp["M"]
2021-07-02 21:10:54 1819 1
原创 Java算法题输入输出模板
头文件一般只需要import java.io.* 和import java.util.*使用BufferReader和BufferWriter输入输出实现readLine()函数读取一整行int类型数字,存在数组里,这个操作很常见import java.io.*;import java.util.*;public class Main { static class Node{ public int x; public int y; pu.
2021-06-17 17:22:29 1194
原创 Java知识点集锦
1、Java和C++的区别?都是面向对象的语言,都支持封装、继承和多态Java 不提供指针来直接访问内存,程序内存更加安全Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。Java 有自动内存管理机制,不需要程序员手动释放无用内存...
2021-05-31 15:38:47 291 1
原创 Java并发编程(七)——JUC
一、读写锁ReentrantReadWriteLock\quad当读操作远远高于写操作时,可以使用读写锁让读-读可以并发,提高性能。读写操作是互斥的,不能同时进行。二、信号量semaphore\quad用来限制能同时访问贡献资源的上限。public static void main(String[] args) { Semaphore semaphore = new Semaphore(3); // 同一时刻允许三个线程访问 // 没有semaphore,10个线程同时运行同时结束
2021-04-28 16:29:34 323
原创 Java并发编程(六)——线程池
一、自定义线程池\quad线程池跟连接池一样,维护线程池可以减少线程创建和关闭的时间。首先实现一个自定义线程池。首先是创建一个管理任务的阻塞队列,防止任务突然变多,线程忙不过来而造成任务丢失的情况。Thread pool维护一堆线程。class BlockingQueue<T>{ // 1. 任务队列(双向链表,先进先出) private Deque<T> queue = new ArrayDeque<>(); // 2. 锁(多个线程获取
2021-04-26 20:14:43 503
原创 Java并发编程——无锁(乐观锁)的方式实现并发
1、CAS\quad使用CAS(compare and swap)来实现无锁时线程安全,因为CAS操作底层是原子的。其实CAS底层是lock cmpxchg指令,在单核和多核CPU下都能够保证比较-交换的原子性。CAS操作需要volatile的支持,需要保证变量的可见性,因此可以用AtomicInteger代替int,其内部使用了volatile修饰。\quadCAS效率比synchronized效率高,原因?无锁情况下,即使重试失败,线程始终在高速运行,没有停歇,而 synchronized 会让线程
2021-04-21 15:36:32 767
原创 Java并发编程(五)——共享变量在多线程间原子性、可见性和有序性
\quad上一节讲解的Monitor主要关注临界区代码的原子性。Java内存模型(JMM)定义了主存、工作内存的抽象概念,体现在以下几个方面:原子性:保证指令不会受到线程上下文切换的影响可见性:保证指令不会受cpu缓存的影响有序性:保证指令不会受cpu指令并行优化的影响1、可见性\quad内存可见性问题:一个线程对主存数据进行了修改,对其他线程不可见。如下例子,run被主线程修改了,但是t线程被优化了在高速缓存中读取run,导致没有读取改变后的run值,程序会一直运行下去: stati
2021-04-20 11:27:16 364
原创 I/O多路复用——select/poll/epoll
\quadI/O多路复用解决的问题:假设一台服务器要服务于多台客户端,一种方法是使用多线程,但是这对服务器cpu等提出高要求,且线程存在上下文切换,影响效率。如果使用单线程的方式可以怎么完成呢?linux一切皆文件,每个客户端的请求数据都保存在一个文件中,因此可以让服务器不断的循环遍历这些文件依次处理。\quadselect、poll、epoll都是I/O复用的机制,可以监视多个描述符,一旦某个描述符就绪,就能够通知程序进行相应的读写操作。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小
2021-04-19 15:36:13 329
原创 Mysql知识点集锦
1、Mysql常见存储引擎InnoDB\quad在Mysql5.5.8版本后,InnoDB成为Mysql默认存储引擎,支持事务和行级锁和外键,InnoDB通过多版本并发控制(MVCC)来获得高并发性,并实现了事务的四个隔离级别:未提交读:可读取未提交的操作数据,最低的隔离级别,这种情况会出现脏读。脏读:一个事务读取到了缓存中另一个事务未提交的数据。说明:当事务B对data进行了修改但是未提交事务,此时事务A对data进行读取,并使用事务B修改的数据做业务处理。已提交读:一个事务等待另一个事务提交
2021-04-13 09:18:16 270
原创 linux下分析c++程序各个函数运行时间和调用次数
\quad博主当前系统为centos7,如果是其他linux会在安装c++性能分析工具时有所区别,但使用方法完全一样。1、gprof\quad准备工作:假设你写了cpp程序命名为test.cpp,首先将其编译:g++ -o test test.cpp -pg -std=c++11,这里需要指定选项-pg,能产生供gprof剖析用的可执行文件,编译后可执行文件为test。\quad第一步:执行可执行文件./test,会在当前目录下生成gmon.out。注意:此时执行时间会更长一些,主要原因时gprof内
2021-03-31 16:21:22 4776
原创 Java面经
1、 类加载机制和类加载器的双亲委派机制\quad虚拟机将描述类的class二进制字节码文件加载到内存,并对数据进行校验、转换解析和初始化,最终成为可以被JVM使用的Java类型,这一整套流程就是类加载机制。细节如下:加载:通过全限定类名获取定义此类的二进制字节流,并将此字节流所代表的静态存储结构转化为方法区运行时的数据结构,最后在内存中生成一个代表这个类的Class对象,这样可以在后面通过该对象获得该类的各种数据,例如获得该类的Methods,Fields等等验证:主要是确保字节码文件中包含的信息
2021-03-06 21:52:22 1730 3
原创 Java并发编程(三)——管程:使用悲观锁的思想解决多线程并发中的共享问题
一、共享带来的问题\quad当多个线程访问一个共同的资源时,会发生线程安全问题。假设有共享变量i=0,有两个任务,任务1对该变量进行+1操作,任务2对该变量进行-1操作。假设线程t1对i进行+1操作,但还未来得及保存,此时i=0,时间片就切换给线程2,此时线程2又对i进行-1操作并保存,此时i=-1,t2线程结束,时间片给t1,t1将上次未保存的结果1给i,最终输出i=1。按理说i最后等于0,但是由于多个线程操作共享资源,导致了线程安全问题。例如下面程序,返回结果就可能是:[-10000,10000]中任
2021-03-05 22:22:24 327 1
原创 剑指offer:最小的k个数
\quad输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]\quad这里给出一个三路partition的操作,速度最快,可见测试数据中有很多重复元素。class Solution {public: int partition(vect
2021-03-04 21:49:28 144 1
原创 Java并发编程(二)——线程中的常见方法(join,yield,sleep等)和线程状态
1、start():启动一个新线程,在新的线程中运行run方法。注意:该方法只是让线程进入就绪状态,里面代码不一定立刻执行(CPU时间片还没分给它)。2、join():等待线程运行结束,写上t1.join(),程序运行到这句话时会等待线程t1运行结束后再执行后续操作,该方法提供了线程间运行顺序的控制,假设t2线程需要等待t1线程运行完才能执行,则可以在t2线程前加上t1.join()。static int r = 0;@Testpublic void test1() throws Interrupt
2021-03-03 22:03:10 273 1
原创 HashMap源码剖析
\quad红黑树底层实现是数组+链表+红黑树。大体逻辑是:创建一个长度为2的幂大小的数组table,里面存放Node节点当一个键值对插入散列表时,首先计算当前键值对Key的hash值,根据寻址算法(index=(table.length-1)&hash(key)),这样每一个键Key都能映射到[0,table.length-1]的区间中去当多个键值对的Key对应的hash值相同时,会在其对应的位置形成链表或者红黑树,当相同hash值Key数目达到8个时,会从链表树化为红黑树;反之当其数目减少
2021-03-03 18:59:57 233 1
原创 Java并发编程(一)——进程与线程概念和创建线程的方法
一、进程和线程概念进程概念进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存线程概念线程是进程的基本执行单元,一个进程的所有任务都在线程中执行进程要想执行任务,必须得有线程,进程至少要有一条线程一个进程可以分为多个线程,一个线程就是一个指令流,将指令流的一条条指令交给CPU执行Java中线程是最小调度单位,进程作为资源分配的最小单位二者关系进程间相互独立,线程是进程的组成部分进程的资源供其线程共享,因此线程间通信简单,多个线程可
2021-03-03 11:13:52 201
原创 JVM中实用性细节
1、设置Java虚拟机栈大小-Xss\quadJava默认栈大小为1M,如果在多次使用递归函数的情况下可能会爆栈,例如示例程序,我是用递归函数dfs来求解1+2+3+...+n的值,在n=100000时就会爆栈。\quad我们修改配置,加上编译参数-Xss1024m就可以防止爆栈,但是也不能修改得太大,因为总的内存是一定的,如果给每个线程开启的栈内存过大会导致无法开启多个线程。\quad上述爆栈称为栈帧数目过多导致爆栈,在一个线程里面,每一次调用函数都会形成一个栈帧放入栈内,上述例子会调用1000
2021-02-21 21:00:43 267 4
原创 Java 8新特性
1、接口里面不仅可以有抽象方法,还可以有默认方法\quad默认方法需使用default关键字修饰。接口中除了可以定义抽象方法,还可以定义静态常量和静态方法,java8以后还可以定义默认方法。接口中方法都是public的,故而可以省略public不写。如下例子:public interface Formula { // 静态常量 static final String s = "Hello"; // 静态方法 static void say(){ Syst
2021-01-31 22:33:28 428
原创 微软笔试题
题目三\quad给一个无向图,N个顶点,M条边,0为起点,N-1为终点,每条边初始权值为 1。图中除普通节点外有 4 种节点。第一种:走过这种节点后的两条边权值翻倍(Sand)第二种:走过这种节点后的两条边权值减半 (Nitro)第三种:走到这个节点就停止,不能再走了(Cop)第四种:走到这个节点,下一条边的权值+1(Crash)求节点 0 到 N-1 的最短权值和路径。输入样例:第一行为点数和边数;第二行为n个字符串表示这n个点的属性;接下来有m行,每行两个节点编号,表示这两个节点有一条
2021-01-30 17:20:13 884
原创 子集划分问题
一、将一个数组划分为两个子集数组里面数取值范围无限制:爆搜+优化数组里面数取值范围有限制:背包1、Leetcode416 分割等和子集\quad给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。每个数组中的元素不会超过 100;数组的大小不会超过 200。输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].int f[10010];class Solution {public:
2021-01-29 23:51:16 3679
原创 Java lambda表达式
package lambdaTest;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class test1 { public static void sort1(){ List<Integer> arr = new ArrayList<>(); arr.
2021-01-26 16:33:19 346 1
原创 Java读取配置文件:xml、properties和yml
\quad在项目中,常常使用配置文件,配置文件类别大都分为三种:xml、properties和yml。接下来我们一一解析这三种文件在java中如何读取。一、读取xml文件\quad我们可以借助dom4j进行解析,先点击此处下载该jar包,将包导入工程中去。我们新建一个class.xml文件,内容如下:<class name="uestc"> <student> <name>张三</name> <age>
2021-01-26 16:33:01 2001 1
原创 Java注解和反射
一、Java注解的概念\qquadJava 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。\quad接下来介绍几个常见的注解:@Override:检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报
2021-01-21 16:15:09 498
原创 redis学习和Java调用Redis
一、redis基础知识\quad博主建议redis基础数据类型以及命令在菜鸟教程过一遍即可,一两个小时足矣,点击此处。\quadJava调用redis可以在IDEA上新建一个maven工程,在配置文件pom.xml中导入redis的依赖即可,这样就不需要自己手动下载包再导入了,非常的方便。在pom.xml中依赖如下:<dependencies> <dependency> <groupId>redis.clients</groupId&g
2020-12-24 16:12:17 2804
原创 Java垃圾回收机制GC
一、如何判断对象是否为垃圾1、对象被判定为垃圾的标准没有被其他对象引用2、判断对象的引用数量来决定是否是垃圾判定标准:通过判断对象的引用数两来决定对象是否可以被回收;每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1;任何引用计数为0的对象实例可以当作垃圾优点:执行效率高,程序执行受影响小缺点:无法检测出循环引用的情况,如父对象引用子对象,子对象反过来引用父对象,这样这两个对象永远不可能为0,导致内存泄漏。3、可达性分析算法来决定对象是否为垃圾\quad通
2020-12-23 21:07:58 2734 1
原创 JVM
一、Java跨平台性\quadJava源码首先被编译成字节码,再由不同平台的JVM进行解析,Java语言在不同的平台上运行时不需要进行重新编译,Java虚拟机在执行字节码时,把字节码转换成具体平台上的机器指令。查看Java程序对应的字节码:首先使用javac xxx.java指令生成Java文件对应的字节码文件:xxx.class使用javap -c xxx.class指令反编译字节码文件二、JVM如何加载class文件1、JVM架构Class Loader:依据特定格式,加载cla
2020-12-22 16:07:34 2688 2
原创 数据库学习
一、什么是关系型数据库和非关系型数据库1、关系型数据库\quad关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。\quad关系型数据库中有许多张表,每张表表示现实世界的各种实体。各种实体之间的联系均用关系模型来表示。特点1.存储方式:传统的关系型数据库采用表格的储存方式,数据以行和列的方式进行存储,要读取和查询都十分方便。2.存储结构:关系型数据库按照结构化的方法存储数据,每个数据表都必须对各个字段定义好(也就是先定义好表的结构),再根据表的
2020-12-22 09:03:14 1287
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人