DWZ

经典算法之回溯法

牧云@^-^@ 提交于 2021-02-12 11:31:37
概念 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。 但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯 条件 的某个 状态 的点称为“ 回溯点 ”。 基本思想 回溯法按深度优先策略搜索问题的解空间树。 首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。 如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯; 否则,进入该子树,继续按深度优先策略搜索。 回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。 剪枝函数包括两类: 1. 使用约束函数,剪去不满足约束条件的路径; 2.使用限界函数,剪去不能得到最优解的路径。 问题的关键在于如何定义问题的解空间,转化成树(即解空间树)。 解空间树分为两种: 子集树和排列树。 两种在算法结构和思路上大体相同。 实现思路 回溯法的实现方法有两种: 递归和迭代 。 一般来说,一个问题两种方法都可以实现,只是在算法效率和设计复杂度上有区别。 1. 递归 思路简单,设计容易,但效率低,其设计范式如下: //针对N叉树的递归回溯方法 void backtrack ( int t ) { if ( t > n ) output ( x ); //叶子节点

一文带你了解爬虫

时光毁灭记忆、已成空白 提交于 2021-02-11 17:27:44
点击上方“ 逆锋起笔 ”,选择“星标” 我们一起「在看」 作者: 猪哥 来源: 裸睡的猪 整理:君未读 前段时间我妈突然问我:儿子,爬虫是什么?我当时既惊讶又尴尬,惊讶的是为什么我妈会对爬虫好奇?尴尬的是我该怎么给她解释呢? 一、爬虫介绍 1.爬虫是什么 网络爬虫(web crawler 简称爬虫)就是 按照一定规则从互联网上抓取信息的程序 ,既然是程序那和正常用户访问页面有何区别?爬虫与用户正常访问信息的区别就在于:用户是缓慢、少量的获取信息,而爬虫是 大量 的获取信息。 这里还需要注意的是: 爬虫并不是Python语言的专利 ,Java、Js、C、PHP、Shell、Ruby等等语言都可以实现,那为什么Python爬虫会这么火?我觉得相比其他语言做爬虫Python可能就是各种库完善点、上手简单大家都在用,社区自然活跃,而社区活跃促成Python爬虫慢慢变成熟,成熟又促使更多用户来使用,如此良性循环,所以Python爬虫相比其他语言的爬虫才更火。 下面就是一段hello world级别的Python爬虫, 它等效于你在百度搜索关键字: python 。 2.爬虫案例 既然爬虫是大量抓取网页,那是不是爬虫都是不好的呢?答案当然不是,可以说我们的日常上网已经离不开爬虫了,为什么这么说?下面我就为大家盘点几个爬虫日常应用: 搜索引擎: 如Google、百度、雅虎、搜狗

分布式事务有哪些解决方案?

↘锁芯ラ 提交于 2021-02-07 20:30:16
来源:http://dwz.date/eaAm 分布式事务是什么 数据库事务的特性包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durabilily),简称 ACID。 在数据库执行中,多个并发执行的事务如果涉及到同一份数据的读写就容易出现数据不一致的情况,不一致的异常现象有以下几种。 脏读 ,是指一个事务中访问到了另外一个事务未提交的数据。例如事务 T1 中修改的数据项在尚未提交的情况下被其他事务(T2)读取到,如果 T1 进行回滚操作,则 T2 刚刚读取到的数据实际并不存在。 不可重复读 ,是指一个事务读取同一条记录 2 次,得到的结果不一致。例如事务 T1 第一次读取数据,接下来 T2 对其中的数据进行了更新或者删除,并且 Commit 成功。这时候 T1 再次读取这些数据,那么会得到 T2 修改后的数据,发现数据已经变更,这样 T1 在一个事务中的两次读取,返回的结果集会不一致。 幻读 ,是指一个事务读取 2 次,得到的记录条数不一致。例如事务 T1 查询获得一个结果集,T2 插入新的数据,T2 Commit 成功后,T1 再次执行同样的查询,此时得到的结果集记录数不同。 脏读、不可重复读和幻读有以下的包含关系,如果发生了脏读,那么幻读和不可重复读都有可能出现。 不同隔离级别 SQL 标准根据三种不一致的异常现象

Prometheus 与 nodata 告警

随声附和 提交于 2021-01-21 11:36:15
背景 随着云原生和高动态服务端的发展,在运维领域,以 Prometheus 为代表的现代时间序列存储正在加速替代以 Zabbix 为代表的传统监控系统。运维领域在享受时间序列技术发展红利的同时,也面临时间序列管理思路上的转变和监控系统实际应用的上一些难点 —— nodata 告警便是其中之一。nodata 告警是传统监控系统的必备功能,但却缺席了几乎所有现代时间序列存储实践,这给运维监控带了诸多缺陷。本文尝试分析其中原因,并给出一些可能的解决方法。 nodata 告警触发器的特殊性与必要性 nodata 告警触发器(Trigger)与普通告警触发器相比具有原生的特殊性。普通告警触发器的作用是对一组监控指标(Metric)的过滤,通常是基于数值大小的过滤。 运维监控场景下,发生 nodata 告警最大的可能性是监控系统本身的失效,比如采集点失效或采集对象失效,在我们的实践中,服务器意外下线、磁盘故障、服务崩溃等都会导致 nodata 告警;另外还有一类监控指标,这类指标以 nodata 为『正常状态』,如 5xx code 产生的速率,在没有 5xx code 产生时,虽然我们希望指标的数值为 0 (而不是 nodata) ,但在实践中往往很难保证,对于这类指标有效性的保证,我们会在其他文章中详细说明。 nodata 告警触发器的难点之一在于全集 U 的获取。在高动态的服务端环境中

一行代码实现Python并行处理

好久不见. 提交于 2021-01-20 05:57:03
Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏"重"。而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容。 传统的例子 简单搜索下"Python 多线程教程",不难发现几乎所有的教程都给出涉及类和队列的例子: import os import PIL from multiprocessing import Pool from PIL import Image SIZE = (75,75) SAVE_DIRECTORY = 'thumbs' def get_image_paths(folder): return (os.path.join(folder, f) for f in os.listdir(folder) if 'jpeg' in f) def create_thumbnail(filename): im = Image.open(filename) im.thumbnail(SIZE, Image.ANTIALIAS) base, fname = os.path.split(filename) save_path = os.path.join(base, SAVE_DIRECTORY, fname) im.save(save_path)

IoC与AOP的那点事儿

吃可爱长大的小学妹 提交于 2021-01-14 02:34:40
封面图 原文出处: http://dwz.date/eSm 欢迎点击上方蓝色字体『 Bella的技术轮子 』关注哦~ IoC 控制反转(Inversion of Control)是 OOP 中的一种设计原则,也是 Spring 框架的核心.大多数应用程序的业务逻辑代码都需要两个或多个类进行合作完成的, 通过 IoC 则可以减少它们之间的耦合度. 实现方法 IoC 的主要实现方法有两种, 依赖注入 与 依赖查找 . 依赖注入 : 应用程序被动的接收对象, IoC 容器通过类型或名称等信息来判断将不同的对象注入到不同的属性中. 依赖注入主要有以下的方式: 基于set方法 : 实现特定属性的public set()方法,来让IoC容器调用注入所依赖类型的对象. 基于接口 : 实现特定接口以供IoC容器注入所依赖类型的对象. 基于构造函数 : 实现特定参数的构造函数,在创建对象时来让IoC容器注入所依赖类型的对象. 基于注解 : 通过Java的注解机制来让IoC容器注入所依赖类型的对象,例如Spring框架中的@Autowired. 依赖查找 : 它相对于 依赖注入 而言是一种更为主动的方法,它会在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态. IoC的思想 在传统实现中,我们都是通过应用程序自己来管理依赖的创建,例如下代码

Python的collections原来这么好用!

浪尽此生 提交于 2021-01-12 15:35:26
<section id="nice" data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px; color: black; padding: 0 10px; line-height: 1.6; word-spacing: 0px; letter-spacing: 0px; word-break: break-word; word-wrap: break-word; text-align: left; font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;"><p data-tool="mdnice编辑器" style="font-size: 16px; padding-top: 8px; padding-bottom: 8px; margin: 0; line-height: 26px; color: black;">collections是实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和

Python 开发人员常犯的这7个错误,可能是“致命”的!

痴心易碎 提交于 2021-01-12 15:08:41
<section id="nice" data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px; color: black; padding: 0 10px; line-height: 1.6; word-spacing: 0px; letter-spacing: 0px; word-break: break-word; word-wrap: break-word; text-align: left; font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;"><p data-tool="mdnice编辑器" style="font-size: 16px; padding-top: 8px; padding-bottom: 8px; margin: 0; line-height: 26px; color: black;"><img src="https://imgkr2.cn-bj.ufileos.com/e81da1b9-d99e-49fa

【基础回溯2】Java 基础知识疑难点/易错点

﹥>﹥吖頭↗ 提交于 2021-01-12 06:31:38
本文已经收录自 https://github.com/Snailclimb/JavaGuide (59k+ Star):【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。 阅读原文即可获取最新更新! ps: 之前发过这篇文章,不错后面又对内容重新完善和增加了部分内容,而且为了应读者要求做一个文章分类目录菜单,为了保证文章的质量和准确性重新发送了一遍。 1. 基础 1.1. 正确使用 equals 方法 Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 举个例子: // 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常 String str = null ; if (str.equals( "SnailClimb" )) { ... } else { .. } 运行上面的程序会抛出空指针异常,但是我们把第二行的条件判断语句改为下面这样的话,就不会抛出空指针异常,else 语句块得到执行。: "SnailClimb" .equals(str); // false 不过更推荐使用 java.util.Objects#equals (JDK7 引入的工具类)。 Objects.equals( null , "SnailClimb" ); // false 我们看一下 java.util

一文带你了解爬虫

我与影子孤独终老i 提交于 2021-01-12 05:35:07
六月分享主题:爬虫 HTTP详解 网页结构简介 前段时间我妈突然问我:儿子,爬虫是什么?我当时既惊讶又尴尬,惊讶的是为什么我妈会对爬虫好奇?尴尬的是我该怎么给她解释呢? 一、爬虫介绍 1.爬虫是什么 网络爬虫(web crawler 简称爬虫)就是 按照一定规则从互联网上抓取信息的程序 ,既然是程序那和正常用户访问页面有何区别?爬虫与用户正常访问信息的区别就在于:用户是缓慢、少量的获取信息,而爬虫是 大量 的获取信息。 这里还需要注意的是: 爬虫并不是Python语言的专利 ,Java、Js、C、PHP、Shell、Ruby等等语言都可以实现,那为什么Python爬虫会这么火?我觉得相比其他语言做爬虫Python可能就是各种库完善点、上手简单大家都在用,社区自然活跃,而社区活跃促成Python爬虫慢慢变成熟,成熟又促使更多用户来使用,如此良性循环,所以Python爬虫相比其他语言的爬虫才更火。 下面是一段hello world级别的Python爬虫, 它等效于你在百度搜索关键字:python 。 2.爬虫案例 既然爬虫是大量抓取网页,那是不是爬虫都是不好的呢?答案当然不是,可以说我们的日常上网已经离不开爬虫了,为什么这么说?下面我就为大家盘点几个爬虫日常应用: 搜索引擎:如Google、百度、雅虎、搜狗、必应等等很多搜索引擎其本质就是一个(可能多个)巨大爬虫,这些搜索引擎工作原理是