很久都没有整理博客了,近来在工作中有一些关于 SQL 查询语句的积累,而且有一个很大点在于工作中的思维模式和关注点跟学生时代的 ACM 比赛中有很大的差别。这些需要慢慢积累,并且一步步的适应这种转变。
-
posts
-
关于SQL执行细节的积累和反思
-
素数筛法和如何魔改筛法
当要判断一个数是否为素数的时候,素数筛法有很多,但是他们的核心思想是基本相同的即素数可以和其他数相乘得到合数,筛去合数剩下的就是素数。最近一段时间发现素数筛法并不只是单独的运用在判断素数,而是可以通过简单魔改而得到其他功能。
-
在区间问题中使用的差分思想
首先可以先看一下
Wiki
上对差分的定义是数学中的一个概念,它将原函数 映射到 。如果说差分是前缀和的一种相对策略,那么这样就不会陌生了。通常在对一些区间问题的求解的时候会要求使用 的复杂度去解决所有区间的答案求和还有对区间的修改的反馈,这时候就需要用到一些差分的思想来解决问题。 -
移动硬盘安装Ubuntu折腾笔记
最近准备学习一下《Unix 环境高级编程》这本书,就想到要配置一个普通的环境来使用编写一些使用
Unix
操作系统调用的 Demo 来练习。这里想到了三种办法来配置开发环境分别是虚拟机、双系统和使用移动存储介质,这里我选择的是使用 U 盘来测试这里的安装流程,而且巧妙地避免了常常遇到的引导和分区问题。 -
Web的基本安全和鉴权方式
最近在写一个提供文本记录和文件断点续传的
Web
程序,因为缺乏经验,在刚刚上线测试的时候被几个朋友的XSS
和伪造Cookie
给锤爆了。在修补程序的过程中对中间件有了一定的了解,并上网查询了一些关于Cookie
、Token
和Session
的知识,在这里做一些记录,但一切的一切都要记住一句话:永远不要相信用户输入。 -
乘法逆元与组合数定理
在基础的数学理论中逆元是一个不可缺少的概念,也在除法取模的过程中用到。在组合数求取过程中,因为阶乘数一般偏大,所以对组合数取模也是算法题目中一般的处理方式。组合数学也是一个比较有趣的方向,需要的是思维、推理还有对组合数概念的了解。
-
浅析C++STL标准容器
STL
是标准模板库,主要有容器、分配器、算法、适配器、迭代器和函数对象等组成,各类之间互相独立,比如容器和算法互相独立,通过迭代器来沟通。 -
关于不同IO函数和缓冲
比赛中无意发现了问题,但是如果不知道原因也无从修改,所以了解了
cin
和cout
同标准输入输出的同步问题和效率问题。 -
XOR位运算和线性基解析
线性代数中基就好像是向量中的基向量。线性基是异或运算的基,定义为通过原集合
中的最小子集中的元素可以相互异或的值域 和原集合的相互异或的值域 相同。相当于用原集合中最少最精简的元素组成子集,实现原集合相同的的异或值域的效果。通常情况下很多和二进制有关的组合问题可以用线性基来完成,并且需要理解XOR
位运算的含义。 -
并查集和最小生成树
并查集是一个用树形来表达联通关系或者集合关系的数据结构,思想很简单但是十分巧妙,主要有查找和合并两种基本操作,这种数据结构也用在了图论中最小生成树中,通常还会有一些加权值的情况和路径上的复杂关系的。
-
关于Catalan数列
卡特兰数列是组合数学中一个经常在各种计数问题中出现的数列。其实最早清朝数学家明安图在其《割圜密率捷法》中就已经发明了这种技术方法。
Catalan
数列中前几项为1 1 2 5 14 42 132 429 1430 4862 16796
等,在解题过程中可以联系一下。它更像是一个由问题总结出来的数列,本身很难发现规律,个人的理解该数列经常和一些二分选择划分和有条件前缀排列问题的计数有关。 -
图论的最短路径算法
最短路径问题是图论中常见的问题,因为求最短路径常常采用的是一种贪心或者动态规划的思想,当然也会有其他的。其代表性的算法有迪杰斯特拉算法、弗洛伊德算法和SPFA算法。它们适用于不同的情况比如普通的有权有向图、有权有环图、还有负权有环图等等。问题很大概率上不是符合模板的题目,但是了解这些算法可以让解决问题的过程中多一种思路和方法。
-
区间及RMQ问题总结
区间问题常常是对某一个数组的指定区间进行查询、更改和维护某些属性。如果不采用高效算法的话每次的查询都将是遍历查询,而且如果要维护某个区间的属性的话那就更加的困难。这里对于区间问题主要采用的是树状数组、线段树和ST 表等方法来完成区间操作,还有一种思想比较简单的分块法和前缀和来处理区间数据。
-
Golang基础结构与类型
任何语言都有其数据类型和数据结构,
Go
语言中的类型比较简单,数据结构也比较精简。 -
OOP面向对象C++编程
面向对象编程是
C++
引入的另一种思想,也成为了和C
语言之间最大的区别了。生活中或者实际问题中的对象经过抽象,就可以抽象地用类去定义对象以及对象所具有的方法。 -
区分C++多态和重载
多态和重载在实际运用中是非常重要的部分,多态实现了代码的重用,重载提供了函数或运算符的多样性。
-
在JS中实现面向对象
JavaScript
号称万物皆对象,但是面向对象编程并不是它的主要的编程哲学。每种语言都有自己最合适的编程方法,而JS
并不是为了面向对象而生的,所以不要强行去使用面向对象,不要为了OOP
而OOP
。其实它更加的偏向于函数式编程,但是对这种也有一定的支持。 -
常用设计模式Go实现
设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。站在巨人的肩膀上才能看得更远,但对于小程序的编写其实不是太必要强行套用各种设计模式,该怎么办怎么办就好。
-
Go原生测试代码工具
Go
自带了测试框架和工具,在testing
包中,以便完成单元测试Test
和性能测试Benchmark
。一般测试代码放在后缀_test
文件中,与被测代码放于同一个包中,在编译的过程中不会把这些文件编译进可执行文件中,而使用指令可以区测试这些代码查看是否能够得到正确结果,就像评测机一样还能测试性能。 -
了解CSS样式表基础知识
CSS
严格意义上讲不是一种编程语言,叫做层叠样式表,是用来细化网页页面的样式和布局的。它和HTML
相结合就可以形成很多我们常见的有一定样式的网页页面,如果需要更多动态交互则还需要JavaScript
。而CSS
会告诉浏览器如何布局,和如何处理样式。 -
相关C++函数使用解析
函数在程序中分为有返回值和无返回值。函数是一种问题的通用方法,既可以使用标准函数库中的函数也可以自定义需要的函数又分为按值传递、指针传递和引用传递,在
C++
中函数的种类是十分丰富的。 -
并发编程Go实现及其上下文控制
相较于其他语言,Go 在并发编程方面有得天独厚的优势,在语言层面上支持了一种协程即用户态线程来实现并发编程。轻量级的协程带来了更快的上下文切换,以及不用涉及内核态转换的优势。能够高效的进行并发编程的开发,并且拥有还不错的性能。
-
在Go中实现面向对象编程
至于
Go
语言到底是否支持面向对象的编程,语言作者给出的答案是Yes and no
。在其中有对象的存在和方法,但是没有显式的多态和各种面向对象编程中传统意义上的特性。所以要稍微改变一下之前面向对象的编程思想,不要写出为了面向对象而面向对象的别扭代码。 -
接口在Golang中的引入
Go
语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。著名的Duck Typing
非常好的解释了接口的特性即“这个东西叫起来像鸭子,走起来像鸭子,那可以认为它就是鸭子”。接口是典型的like-a
的判断关系,而且在这种语言中是隐式的实现接口。 -
Golang函数类型和闭包
在
Golang
中万物皆有类型函数也不例外,函数的使用是每一种语言中无法缺省的一部分。函数的重要性一部分源自于现代计算机进程执行模型大部分是基于堆
和栈
的,编译器不需要太多的转换即可通过函数实现进栈压栈出栈,函数在Go
语言中更是作为第一公民。