自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Django中的select_related和prefetch_related方法对比

模型定义class Author(models.Model): """作者模型""" name = models.CharField(max_length=100) age = models.IntegerField() email = models.EmailField() class Meta: db_table = 'author'...

2019-10-15 21:54:18 300

原创 Django的ORM中的反向引用和反向查询

Django中的多对一、一对一、多对多关系在Django中,可以使用models.ForeignKey、models.OnetToOneField、models.ManyToManyField来分别实现多对一、一对一和多对多的表关系,例如下面的例子:多对一关系class User(models.Model): username = models.CharField(max_lengt...

2019-10-14 15:14:35 1366

原创 Python的property装饰器

在别的语言中,例如Java和C++,在实现类时都会实现get和set方法来控制私有属性的改变,防止我们直接在代码中使用.操作符来改变属性值,以至于导致不可预料的错误和后果。在python中有另外的实现思路,这就是property装饰器。例如下面的代码:class Plane(object): """" 模拟飞机大战 """ def __init__(self...

2019-10-04 14:30:03 176

原创 Python3中的比较运算魔术方法

在Python3中,如果我们自定义了一个类,当我们需要比较两个类对象的大小时,就需要我们自定义比较的方法,但是在Python2中可以很方便使用的__cmp__方法在python3中已经被废弃了,需要我们单独实现别的比较方法。== 和 !=判断两个对象是否相等需要我们重载__eq__或者__ne__方法,可以只实现其中一种就实现判断==和!=。class Person(object): ...

2019-10-04 13:51:28 368

原创 Python3中的__new__()方法

__new__方法是用来创建对象的,而__init__方法是用来初始化类对象的,因此__new__方法的会先于__init__方法执行。__new__方法可以用来实现python中的单例设计模式,但是在Python3中,__new__方法的写法有所改变:class User(object): __instance = None def __new__(cls, *args, ...

2019-10-02 16:42:31 834

原创 Python装饰器

闭包要理解Python的装饰器,首先需要理解闭包的概念。闭包的定义如果在一个函数中,定义了另外一个函数,并且这个函数使用了外面函数的变量,而且外面那个函数返回了里面这个函数的引用,那么称为里面的这个函数为闭包。def greet(name): print("This is out") def say_hello(): print("My name is %s...

2019-09-29 22:51:15 74

原创 Python中的不定数量的函数参数

*args 和 **kwargs首先并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的,不过更建议使用这两个名字,可以让别的程序员更容易理解。*args*args 是用来发送一个非键值对的可变数量的参数列表给一个函数。def var_args(f_arg, *argv): print("first arg:", f_arg) for arg...

2019-09-29 20:43:27 707

原创 Python生成器

为什么需要生成器假如现在有一个需求,我要打印从1-1亿的整形。如果我们采用普通的方式,直接调用range函数,那么程序肯定会崩溃,因为range(1,100000000)函数直接产生一个从1-1亿的列表,这个列表中的所有数据都是存放在内存中的,会导致内存爆满。这时候我们可以采用生成器来解决这个问题,生成器不会一次性把所有数据都加载到内存中,而是在循环的时候临时生成的,循环一次生成一个,所以在程序...

2019-09-29 12:28:04 175

原创 Python可迭代对象和迭代器

基本概念可迭代对象是可以通过"for…in…"遍历的对象,需要实现__iter__()的方法,并且这个方法要返回一个迭代器。迭代器用来返回数据,需要实现__next__()和__iter__()方法,如果迭代器没有返回值了,next()方法就会抛出一个StopIteration异常。判断一个对象是否是可迭代对象from collections import Iterable# 可迭...

2019-09-28 23:30:34 71

原创 2019年双非计算机推免经验

本人基本情况福建四非计科,绩点1/60,综排1/60,四级521,六级508,三年国家奖学金,美赛H奖,省级以上奖10项左右,到手的拟录取offer6个,最终选择浙江大学软件学院。夏令营其实我的夏令营经历可以说是比较失败的,因为当时只想去江浙沪,准确的说只有浙大或者上海的学校,所以当时夏令营只投了5所学校,分别是东华大学、华东理工、华东师范、复旦大学和厦门大学(因为离本科学校近所以也投了),...

2019-09-28 11:57:18 4628 5

原创 字符串匹配问题

定义给定两个字符串text和pattern,需要判断字符串pattern是否是字符串text的字串。把text称为文本串,pattern称为模式串。next数组定义next数组假设有一个字符串s,那么它以i号位作为结尾的子串就是s[0···i]。使得next[i]表示使字串s[0···i]的前缀s[0···k]等于后缀s[i-k···i]的最大的k(注意前后缀不能是字符串本身),如果找不...

2019-09-09 16:39:45 846

原创 PAT(甲级)2019年春季考试题解

7-1 Sexy Primes (20 分)Sexy primes are pairs of primes of the form (p, p+6), so-named since “sex” is the Latin word for “six”. (Quoted from http://mathworld.wolfram.com/SexyPrimes.html)Now given an i...

2019-09-01 16:28:20 3582

原创 拓扑排序

定义拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对于图G中的任意两个顶点u、v,如果存在边u->v,则u一定排在v的前面,这个序列称为拓扑序列。算法流程定义一个队列Q,把所有入度为0的结点加入队列。取出队首结点,输出,然后把所有该结点可以到达的结点的入度减1,如果某个顶点的入度减为0,则将其加入队列。反复进行第2步操作,直到队列为空,如果此时所有的结点都已经加入拓扑序...

2019-08-30 13:47:05 117

原创 并查集

定义并查集是一种维护集合的数据结构,支持以下两种操作:合并:合并两个集合。查找:判断两个元素是否在一个集合。对同一个集合来说只存在一个根结点,且将其作为所属集合的标识。基本操作初始化一开始,每个元素都是独立的集合,所以令所有father[i]=i。for(int i=0; i<n; i++) { father[i]=i;}查找(路径压缩)反复地寻找元素的父亲节点...

2019-08-23 21:29:20 127

原创 平衡二叉树(AVL树)

定义AVL树是一棵二叉查找树,对于AVL树的任意结点来说,其左子树和右子树的高度之差的绝对值不超过1,其中左子树的高度与右子树高度之差称为平衡因子。因为需要对每个结点计算平衡因子,所以需要加入一个变量height。struct node { int data; int height; node *lchild,*rchild;};前备操作获取高度int getHeight...

2019-08-23 16:54:37 160

原创 树和二叉树

树树可以没有结点,被称为空树。树的层次从根结点开始算,根结点为第一层。把结点的子树棵树称为结点的度,树中结点最大的度称为树的度。满足连通、边数等于结点数减一的结构一定是一棵树。叶子结点被定义为度为0的结点,因此在树只有根结点时,根结点也是叶子节点(此时度为0)。结点的深度从根结点(深度为1)开始计算,结点的高度从叶子结点(高度为1)开始计算。树的深度和高度就是结点中的最大值,因此对树...

2019-08-20 20:12:43 156

原创 链表的定义和基本操作

结构体定义包括数据域和指针域。struct Node { int data; Node* next;};创建链表通过数组来创建带头节点的链表。Node* create(int A[],int n) { //创建头指针、前驱指针 Node *head,*pre; head=new Node; head->next=NULL; pre=head; //循环新建节点...

2019-08-20 19:42:30 287

原创 C++ STL 全排列

使用algorithm头文件,加上"using namespace std;",就可以使用next_permutation()获取一个序列在全排列中的下一个序列。#include<iostream>#include<algorithm>using namespace std;int main() { int a[10]={1,2,3}; do{ printf...

2019-08-17 21:37:34 155

原创 C++ STL priority_queue的使用

基本操作priority_queue又称优先队列,实质就是一个堆结构,堆顶的元素是当前优先队列中优先级最高的那一个。要使用优先队列,首先要包含下面两句话。#include<queue>using namespace std;priority_queue的常用函数有push()top()pop()empty()size()和queue不同,优先队列不能使用fro...

2019-08-17 21:04:58 103

原创 随机选择算法

随机选择算法可以对任何输入都以O(n)的时间复杂度找出无序数组中第K大的元素。切分int partition(int A[],int left,int right) { int tmp=A[left]; while(left<right) { while(left<right && A[right]>tmp) right--; A[left]=A[...

2019-08-16 17:24:15 215

原创 快速排序

元素的切分调整一个序列,取出第一个元素,使得该元素左边的元素都小于它,右边的元素都大于它。int partition(vector<int> &v,int left,int right) { //存储最左的元素 int tmp=v[left]; while(left<right) { //找到第一个小于tmp的元素,放到left的位置 while(lef...

2019-08-16 14:47:16 71

原创 归并排序

合并函数2-路归并排序的核心在于如何将两个有序序列合并为一个有序序列。void merge(vector<int>& a,int L1,int R1,int L2,int R2) { int i=L1,j=L2; //定义一个足够大的临时容器 int size=(R1-L1+5)*2; vector<int> tmp(size); int index=...

2019-08-15 21:42:22 259

原创 二分算法

二分查找二分查找需要找到序列中存在的元素的下标,如果值不存在就返回-1,因此循环的条件需要设置为left<=right,当left>right说明所查找的元素不存在,循环中止。int binarySearch(int a[],int left,int right,int target) { //当左端点小于等于右端点时进行循环 while(left<=right) { ...

2019-08-14 21:58:09 70

原创 区间贪心

区间不相交问题问题描述给出N个开区间(x,y),从中尽可能选出多的开区间,使这些开区间两两不相交。例如区间(1,3)、(2,4)、(3,5)、(6,7)解决方案把所有开区间按照左端点从大到小进行排序,左端点相同时按照右端点从小到大进行排序,按这样的顺序依次选出不相交的区间。#include<cstdio>#include<cmath>#include<...

2019-08-12 19:19:21 109

原创 回溯法解决n皇后问题

在全排列的基础上进行求解,如果在到达递归边界前的某层已经不符合,就不需要深入递归,直接进入下一轮或者跳出当前的递归层,保证当到达递归边界时表示一定符合条件。#include<cstdio>#include<cmath>using namespace std;const int MAXN=100;bool vis[MAXN];//记录皇后所在的行数int P[...

2019-08-12 15:48:11 113

原创 Java中抽象类和接口的比较

抽象类包含一个或多个抽象方法的类必须被声明为抽象类,但即使类不包含抽象方法,也可以声明为抽象类。抽象类不能被实例化,但是可以声明抽象类的变量,然后引用非抽象子类的对象。接口接口中所有的方法自动属于public,所有的域自动被设为public static final。接口不能被实例化,但是可以声明接口的变量,然后引用实现了接口的对象。抽象类和接口的比较为什么要引入接口而不直接使用抽象...

2019-07-18 20:42:32 61

原创 Java参数可变的方法

在Java SE 5.0之后的版本提供了可以用可变的参数数量调用的方法,称为变参方法。public class VariableParameter { public static double max(double... values) { double largest = Double.NEGATIVE_INFINITY; for (double val...

2019-07-18 12:39:51 80

原创 Java字符串

StringJava中的String类对象称为不可变字符串,不能修改字符串中的字符。修改字符串使用s.substring(a,b)前闭后开地提取所需的字符,然后使用’+'拼接上替换的字符串检测字符串是否相等使用s.equals(t)方法检测两个字符串是否相等,s和t都可以是字符串变量或者字面量"hello".equals("abc")但是千万不能使用“==" , "=="在Java中...

2019-07-15 21:16:56 60

原创 计算机系统概述

计算机系统概述操作系统的概念操作系统是控制和管理整个计算机系统的硬件和软件资源,合理地组织、调度计算机的工作和资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合。操作系统的特征并发、共享、虚拟、异步,并发和共享是最基本的特征。并发指计算机系统中同时存在多个运行的程序,因此它具有处理和调度多个程序同时执行的能力。引入进程的目的是为了使程序能够并发执行。共享互斥共享方式同...

2019-06-26 13:50:15 117

原创 内存管理

内存管理的基本概念操作系统对内存的划分和动态分配,就是内存管理的概念。内存管理的功能内存空间的分配和回收地址转换内存空间的扩充(虚存、覆盖等)存储保护源程序变为内存中可执行程序的三个步骤编译链接装入程序的链接静态链接:完整的可执行程序装入时动态链接:装入内存时,边装入边链接运行时动态链接:执行时链接,便于更新和修改,便于实现对目标模块的共享程序的装入绝...

2019-05-29 23:33:31 94

原创 Dijkstra算法

Dijkstra算法Dijkstra算法解决的是单源最短路径问题,即给定图G(V,E)G(V,E)G(V,E)和起点sss,求从给定起点sss到其他顶点的最短距离。文章目录Dijkstra算法算法思想程序模板邻接矩阵版邻接表版第二标尺算法思想设置集合VVV为未访问的顶点集,SSS为已被访问的顶点的集合,然后执行n次(顶点个数)下面两步:①每次从集合VVV中选择与起点sss的最短距离最小的...

2019-04-25 22:38:04 136

原创 Django 自定义url转换器

django包含内置的url转换器,有int、uuid等。有时候这些内置的url转换器并不能满足我们的需求,因此django给我们提供了一个接口可以让我们自己定义自己的url转换器。自定义url转换器按照以下五个步骤来走就可以了:定义一个类,直接继承自object就可以了。在类中定义一个属性regex,这个属性是用来限制url转换器规则的正则表达式。实现to_python(self,va...

2019-04-13 21:21:30 289

原创 Django中用于反转url的reverse函数的高级用法

实现形如detail/<id>的URL反转使用reverse函数的kwargs参数,通过字典的方式传入id的值from django.http import HttpResponsefrom django.shortcuts import reverse,redirectdef index(request): username = request.GET.get('u...

2019-04-13 20:28:26 1608

原创 实现临界区互斥的基本方法

软件实现方法单标志法设置一个公用变量turn,若turn=0,则允许P0P_0P0​进程进入临界区,若turn=1,则允许P1P_1P1​进程进入临界区。缺点:两个进程必须交替进入临界区,违背空闲让进。双标志法先检查在每个进程访问临界资源之前,先检查临界资源是否被访问,若正在被访问,则进程需要等待,否则进程进入自己的临界区并设置标志。优点:不用交替进入,可连续使用缺点:检查对方fla...

2019-04-13 19:13:18 2869 1

原创 进程同步

基本概念为什么要引入进程同步?在多道程序环境下,程序是并发执行的,不同进程之间存在着不同的相互制约关系,为了协调进程之间的相互制约关系,引入了进程同步的概念。在操作系统中,要对并发进程进行同步的原因是并发进程是异步的。临界资源一次仅允许一个进程使用的资源称为临界资源,如打印机、公用队列等。对临界资源的访问必须互斥地进行。在每个进程中,访问临界资源的那段代码称为临界区。临界资源的访问分为4...

2019-04-13 18:33:11 2554

原创 url命名/应用命名空间/实例命名空间

为什么要给url命名?因为url是经常变化的。如果在代码中写死可能会经常改代码。给url取个名字,以后使用url的时候就使用他的名字进行反转就可以了,就不需要写死url了。URL反转首先我们需要在path函数中传递一个name参数,即给url命名,示例代码如下:urlpatterns = [ path('',views.index,name='index'), path('...

2019-04-11 20:11:51 1383

原创 Python虚拟环境管理

安装virtualenvpip install virtualenv创建虚拟环境virtualenv [虚拟环境的名字]进入环境windows进入虚拟环境的Scripts文件夹中,然后执行activate*nix进入虚拟环境source /path/to/virtualenv/bin/activate退出虚拟环境deactivate创建环境时指定Python解释器vir...

2019-04-11 12:29:56 180

原创 处理机调度

为什么要进行处理机调度如果没有处理机调度,则意味着必须等待当前进程执行完毕后下一进程才能执行,而进程常需等待外设的输入,I/O的速度相比处理机是非常慢的,因此这会对处理机资源造成严重浪费。引入调度后,可在运行进程等待输入时把处理机调度给其他进程,从而提高处理机的利用率。调度的层次三级调度作业调度(高级)在外存的作业中挑选一个或多个作业,给它们分配内存、I/O设备等资源,并建立相应的进程...

2019-04-10 14:06:32 170

原创 快速乘

当计算a∗b%ma*b\%ma∗b%m的时候,往往较大的数在计算a∗ba*ba∗b时会超出long long的范围,因此就可以使用快速乘的思想,快速乘和快速幂的思想非常相似,快速乘的原理就是利用乘法分配律,把bbb转化为二进制数的形式,跟快速幂的做法相似:遍历每一位,在每一轮都把aaa扩大为自身的两倍,如果当前位是1,则加上当前的aaa。示例代码如下:typedef long long LL;...

2019-04-08 13:32:08 153

原创 快速幂

快速幂的一般格式为:给定三个正整数aaa、bbb、mmm,求ab%ma^b\%mab%m。如果按照时间复杂度为O(b)O(b)O(b)的写法,在 bbb 超过10810^8108时就很容易超时,因此需要引入快速幂。递归写法快速幂基于以下两个条件:如果 bbb 是奇数,那么有 ab=a∗ab−1a^b=a*a^{b-1}ab=a∗ab−1如果 bbb 是偶数,那么有 ab=ab/2∗ab...

2019-04-08 13:05:13 95

空空如也

空空如也

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

TA关注的人

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