要用回溯算法解决问题需要将问题抽象为一个决策序列,一步步做决策,直到问题解决。如果发现某一步已经没有可以解决问题的决策了,或者决策序列已经到头但问题还未解决,就退回上一步进行其它的决策。
常用算法:贪心&分治
1 贪心算法
贪心算法一般解决在给定限制值和期望值的前提下,在满足限制值的情况下,期望值最大的问题。其思路很简单,每次优先选择期望值/限制值最大的选项,然后一步步往下进行选择,直至达到限制值的约束上限。
贪心算法的难点不在算法本身,而是如何证明一个问题是能够用贪心算法解决的。想要严格地证明贪心算法的正确性,是非常复杂的,需要涉及复杂的数学推理。通常我们会凭认知或者举例来判断其正确性,如果不信,那还是用其它的算法吧。
由于贪心算法本身并不复杂,编码也比较简单就不展开了。
图
1.图的一些基本概念
图是一种非线性数据结构。以下是一些图相关的基本概念:
- 顶点:图中的元素称为顶点。
- 边:图中的每个顶点可以与其它顶点建立链接关系,这种关系称为边.
- 无向图:如果关系是双向的,这种图称为无向图。
- 有向图:如果关系是单向的,就称为有向图。
- 度:每个顶点相连接的边的个数,称为顶点的度。在有向图中度又分为入度和出度。
- 带权图:如果这种关系还是带权重的, 就称为带权图。
跳表
我们知道二分查找的效率非常高,一次对比就能将元数据规模缩小一半,最终在O(logn)的时间复杂度内完成有序数组中的特定元素查找。二分查找有一个局限是只能在数组完成该操作,因为其强依赖按下标的随机访问。需要按下标快速定位到中间元素。
如果数据存储在链表中,如何利用二分的思想完成数据查找呢?这种结构就是跳表。
数据结构-逻辑结构&存储结构
之前学习数据结构基本都是数组、链表、树、图一个个学过来。很少去总结他们的内在特点和联系。到底什么是数据结构呢?数据结构的三要素:
- 数据的逻辑结构。
- 数据的存储结构。
- 数据的运算。
这篇博客重点总结下数据的逻辑结构和存储和结构。
回车换行(CRLF)
工作中经常遇到CRLF,\r\n等描述,这里总结一下它们的由来。
HTTP权威指南读书笔记 (2) - URL与资源
1.资源标识符
URI(Uniform Resource Identifier)是更通用的资源标识符,有两个子集:URL和URI。URI并非是HTTP协议独有的,很多协议都使用URI作为协议的资源标识方式:
- mailto:president@whitehouse.gov
- ftp://ftp.lots-o-books.com/pub/complete-price-list.xls
虽说HTTP协议选择URI作为资源标识方式。但实际上,HTTP 应用程序处理的只是其子集URL。
HTTP权威指南读书笔记 (1) - 概述
HTTP协议构建在可靠的数据传输协议(TCP)至上。用于Web客户端向Web服务器请求Web资源。
1 媒体类型
Web资源可能是各种类型的静态文件,也可以是动态产生的内容数据。HTTP使用MIME type 区分这些数据的类型。
MIME type(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)最初设计是为邮件报文服务的,后HTTP也采纳这一套类型管理方式。
HTTP服务器会为所有的HTTP对象附加一个MIME type,用于指导HTTP客户端处理收到的HTTP资源。比如:
字符编码
计算机内部,所有信息最终都是一个二进制值,称为一个bit。八个 bit 组成一个字节(byte)。一个字节一共可以表示256种不同的状态。
但二进制数据是不可读的,如何用二进制的数据来表示我们生活中的字符(A、B、C等),就是字符编码要解决的问题。