遍历

6.4.4 用 dfs 求欧拉回路 (UVa 10129)

我的未来我决定 提交于 2020-01-23 14:13:59
欧拉回路:该回路遍历了一个图中所有的边,并且每条边只遍历一次。(一笔画) 欧拉路径:从起点开始到终点,遍历了图中所有的边,并且每条边只遍历一次。 度数:一个点连接了几条边。 入度和出度分别指:进入该点的边的数量,走出该点的边的数量。 连通无向图存在欧拉回路的充要条件:所有点的度数都为偶数。 连通无向图存在欧拉路径的充要条件:仅存在两个度数为奇数的点,其他点的度数都为偶数。(这两个度数为奇数的点,一个为奇数,一个为偶数) 连通有向图存在欧拉回路的充要条件:对于所有的点,入度等于出度。 连通有向图存在欧拉路径的充要条件: 仅存在两个点,其中一个点的入度比出度大一,另一个店的出度比入度大一。(出度大的为起点,入度大的为终点) 根据连通性和度数可判断出无向图和有向图是否存在欧拉回路和欧拉路径,可用 dfs 构造欧拉回路和欧拉路径。 基本思路:使用 dfs 的方式,遍历图中所有的点。dfs 一个环,然后在回溯的过程中,可能会遇到一个公共点连接着另一个环,此时再对这个公共点进行 dfs 遍历另一个环…… 如此递归。在 dfs 完与 u 结点相连的 v 结点后,再将 u,v 这条边压入输出栈(采用逆序的顺序输出结果,因为 dfs 栈帧入栈的顺序与出栈的顺序相反,起始点最后才出栈)。 例如:用 dfs 求该图的欧拉路径 dfs 遍历该图的顺序为: (1, 2) (2, 3) (3, 4) (4,

网络爬虫技术总结

两盒软妹~` 提交于 2020-01-23 11:47:45
网络爬虫技术总结 http://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&mid=2247484132&idx=1&sn=8db587fabc3c630decf0419b6130770e&scene=23&srcid=0720ZByjAlOM9YC5c76N9uKU#rd   对于大数据行业,数据的价值不言而喻,在这个信息爆炸的年代,互联网上有太多的信息数据,对于中小微公司,合理利用爬虫爬取有价值的数据,是弥补自身先天数据短板的不二选择,本文主要从爬虫原理、架构、分类以及反爬虫技术来对爬虫技术进行了总结。 1、爬虫技术概述 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式。从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。 传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL

HashMap以及源码详解

天涯浪子 提交于 2020-01-23 10:28:30
HashMap实现接口以及继承类 实现了Map,Cloneable,Serializable接口,继承自AbstractMap类。 允许 null 值和 null 键,无序,不允许重复的集合 HashMap底层结构 HashMap底层接口是哈希表,也就是所谓的散列表。 简单介绍一下散列表,散列表的出现是为了解决链表和数组的缺陷,链表增删快,查询慢,数组查询快,增删慢。而散列表基于数组和列表进行演变,使得查询和增删的速度都非常快。 散列表的结构如下。 hashMap中的散列表是用数组+链表+红黑树去实现的 。 好的散列方式,会把数据散列到不同的位置,哪怕散列到同一个位置(这就是所谓的 哈希冲突 ),我们可以把它链起来变成链表(Java采用 链地址法 ),只要这个链表足够的短,我们就可以最快的查询数据,因为遍历两三个节点的时间非常短,近似于O(1)。 当链表足够长( 链表长度 >= 8)并且,节点足够多(节点数 >= 64)的时候,我们就把当前的链表变成红黑树。 (为什么节点 >=8 才变成红黑树,<=6变成链表? 因为根据泊松分布,当节点树大于等于 8 的时候,红黑树查询会比链表查询要快,而当节点数小于等于 6 的时候,会链表查询回避红黑树要快。7的时候是相当。) HashMap常用方法以及源码解析 简单介绍以下变量以及初始值: HashMap的最大容量(MAXIMUM

关于后缀表达式和中缀表达式的思考

我们两清 提交于 2020-01-23 02:28:43
众所周知啦,我们数学里面的公式就是中缀表达式(infix),形如a*(b+c),支持括号用于调整运算的顺序。我们平常用的就是中缀表达式。 那么什么是后缀表达式(postfix)? 后缀表达式(又称为逆波兰reverse polish)就是不需要括号就可以实现调整运算顺序的一种技法。 比如:ab+cde+** 上面就是一个典型的后缀表达式,将它改为中缀表达式其实是(a+b)*((d+e)*c)。我们这样将后缀表达式转换成中缀表达式,虽然符合我们的数学计算习惯,但是并不符合计算机运算的方式。我们可以通过数据结构中的栈来理解后缀表达式和它为什么符合计算机计算。 什么是栈(stack)呢?简单的说就是LIFO(后入先出)。画一张图就是下面这样 堆栈的操作其实很简单,你可以把堆栈想象成一个汉诺塔,你可以在塔顶不断加上汉诺圈,可以从顶部一个一个拿走,但是你不能直接从下面拿走最先放的那个圈。所以你懂了吧,要想拿到最先那个,你必须取出所有的圈,而你最后摆上去的圈可以被立刻拿到。这就是LIFO的本质。 堆栈的实现方法可以是链表或者数组。它们各有各得优点,它们的对比网络上有很多啦,当然我以后也会写出来。 现在你知道了栈这种结构就可以重新理解一遍后缀表达式。我们就以 "ab+cde+**" 这个表达式举例。我们创建一个栈,然后从这个表达式开头(当然是从左边)扫描,如果扫描到的是数据就压(push)到栈中

python基础 ---字典dict

核能气质少年 提交于 2020-01-23 00:45:41
文章目录 字典初始化 查询 修改 删除 遍历 遍历与删除 字典dict也叫映射mapping,字典由任一个元素组成,每个元素叫item或entry。每个item是由(key-value)键值对组成的二元组 特性: 可变性 :可根据key对元素进行定位并修改元素的value值 无序性 :字典是无序的,在Python3.6.x之后,字典会根据录入顺序来显示,但这并不代表字典是有序的 key唯一性 :字典存储时会对key进行hash计算,相同的key只会计算成同一个值,因此字典中是不可能允许相同key同时存在的 字典初始化 dict() ##要使用关键字dict来初始化 dict(**kwarg) #直接使用key=value的方式赋值,**kwargs表示的是若干个key=value dict(iterable,**kwarg) #使用可迭代对象和key=value来生成,可迭代对象中的元素必须是一个二元结构 dict(mapping,**kwarg) #使用映射(另一个字典)和key=value来生成 >> > d1 = { } #这是字典专用的初始化格式,集合虽然也是以大括号包围,但是不能这样初始化 >> > d2 = dict ( name = 'xiejiawen' , age = 25 , sex = 'male' ) >> > d3 = dict ( [ ( 'a' , 2

python爬虫笔记(四)网络爬虫之提取—Beautiful Soup库(2)基于bs4库的HTML内容遍历方法

可紊 提交于 2020-01-22 18:14:06
1. 基于bs4库的HTML内容遍历方法 (1).contents 举例 (2)结点的父亲标签 (4)标签树的上行遍历(parents) (5)标签树的平行遍历 注意:标签的儿子结点可能是 NavigableString 来源: https://www.cnblogs.com/douzujun/p/12229160.html

33迭代器模式(Iterator Pattern)

不羁岁月 提交于 2020-01-22 12:48:17
动机(Motivate): 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作”提供了可能。 使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方法。 意图(Intent): 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。-------《设计模式》GOF 结构图(Struct): 适用性: 1.访问一个聚合对象的内容而无需暴露它的内部表示。 2.支持对聚合对象的多种遍历。 3.为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。 生活中的例子: 迭代器提供一种方法顺序访问一个集合对象中各个元素,而又不需要暴露该对象的内部表示。在早期的电视机中,一个拨盘用来改变频道。当改变频道时,需要手工转动拨盘移过每一个频道,而不论这个频道是否有信号。现在的电视机,使用[后一个]和[前一个]按钮。当按下[后一个]按钮时,将切换到下一个预置的频道。想象一下在陌生的城市中的旅店中看电视。当改变频道时,重要的不是几频道,而是节目内容。如果对一个频道的节目不感兴趣,那么可以换下一个频道,而不需要知道它是几频道。 代码实现: 在面向对象 的软件设计中

Java异常(二) 《Effective Java》中关于异常处理的几条建议

点点圈 提交于 2020-01-22 10:10:46
概要 本章是从 《Effective Java》 摘录整理出来的关于异常 处理的几条建议。内容包括: 第1条: 只针对不正常的情况才使用异常 第2条: 对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常 第3条: 避免不必要的使用被检查的异常 第4条: 尽量使用标准的异常 第5条: 抛出的异常要适合于相应的抽象 第6条: 每个方法抛出的异常都要有文档 第7条: 在细节消息中包含失败 -- 捕获消息 第8条: 努力使失败保持原子性 第9条: 不要忽略异常 它们对应原书中"第8章 异常"部分的第39-47条。 转载请注明出处: http://www.cnblogs.com/skywang12345/p/3544287.html 第1条: 只针对不正常的情况才使用异常 建议:异常只应该被用于不正常的条件,它们永远不应该被用于正常的控制流。 通过比较下面的两份代码进行说明。 代码1 try { int i=0; while (true) { arr[i]=0; i++; } } catch (IndexOutOfBoundsException e) { } 代码2 for (int i=0; i<arr.length; i++) { arr[i]=0; }   两份代码的作用都是遍历arr数组,并设置数组中每一个元素的值为0。代码1的是通过异常来终止,看起来非常难懂

前序与中序遍历序列构造二叉树 中序与后序遍历序列构造二叉树

对着背影说爱祢 提交于 2020-01-22 07:22:29
105. 从前序与中序遍历序列构造二叉树 根据前序遍历和中序遍历,我们可以发现前序遍历的第一个元素就为根元素,在中序遍历中找到这个元素,那么中序遍历中左边为根元素的左子树,右边为右子树,依次递归。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { int len1 = preorder.length-1; int len2 = inorder.length-1; TreeNode root = bulidTree(preorder,0,len1,inorder,0,len2); return root; } public TreeNode bulidTree(int[] preorder, int start1,int end1,int[] inorder,int start2, int end2){ if(start1>end1 || start2>end2){ return

Spark-SQL 面试准备 1

吃可爱长大的小学妹 提交于 2020-01-22 07:06:20
Spark Knowledge NO.1 1. spark中的RDD是什么,有哪些特性? 答:RDD(Resilient Distributed Dataset)叫做分布式数据集,是spark中最基本的数据抽象,它代表一个 不可变 , 可分区 ,里面的元素可以并行计算的集合 Resilient:表示弹性的,弹性表示 Dataset:就是一个集合,用于存放数据的 Destributed:分布式,可以并行在集群计算 1.RDD中的数据可以存储在内存或者磁盘中; 2.RDD中的分区是可以改变的; 五大特性: A list of partitions:一个分区列表,RDD中的数据都存储在一个分区列表中 A function for computing each split:作用在每一个分区中的函数 A list of dependencies on other RDDs:一个RDD依赖于其他多个RDD,这个点很重要,RDD的容错机制就是依据这个特性而来的 Optionally, a Partitioner for key-value RDDs(eg:to say that the RDD is hash-partitioned):可选的,针对于kv类型的RDD才有这个特性,作用是决定了数据的来源以及数据处理后的去向 可选项,数据本地性,数据位置最优 2. 概述一下spark中的常用算子区别