首先先谈谈深度优先和广度优先的定义

深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。

深度优先搜索

节点进行深度优先搜索的顺序

概况
类别: 搜索算法
数据结构:
时间复杂度: {\displaystyle O(b^{m})}
空间复杂度: {\displaystyle O(bm)}
最佳解:
完全性:
其他: b - 分支系数
m - 图的最大深度

广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。

广度优先搜索

节点进行广度优先搜索的顺序

概况
类别: 搜索算法
数据结构:
时间复杂度: {\displaystyle O(|V|+|E|)=O(b^{d})}
空间复杂度: {\displaystyle O(|V|+|E|)=O(b^{d})}
最佳解:
完全性:

通俗的讲:

深度优先:一个一个节点往下找,不找兄弟节点,每一个深度一个节点,先进去的后出来

广度优先:横向取值,一个节点有关联其他的节点,一同被取出来,一个深度多个节点,先进去的先出来

在settings里面的配置:

from   scrapy_redis.queue import PriorityQueue,FifoQueue,LifoQueue
先进先出:广度优先
SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.FifoQueue'
后进先出:深度优先
SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.LifoQueue'
优先级队列:
SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.PriorityQueue'
优先级队列里面也有深度优先和广度优先: requets.priority=1   广度优先
requets.priority=1   深度优先

实现原理:

from scrapy_redis import queue

prio=1

depth = response.meta['depth'] + 1

requets.priority-=depth*self.prio

每一次循环,depth加1
同一个深度可以找到很多url(兄弟节点)

如果是1的话,广度优先

广度优先:
depth 优先级
1 -1
1 -1
1 -1
2 -2

从深度为1的开始往下找,优先级也越大
重点:深度越小,优先级越小

def push(self, request):
"""Push a request"""
data = self._encode_request(request)
score = -request.priority##取反,注意

......

优先级队列:
放进队列里面:
反一下
1 1
1 1
1 1
2 2
......

print('这里优先级是',score)
print(request.meta.get('depth'))
# We don't use zadd method as the order of arguments change depending on
# whether the class is Redis or StrictRedis, and the option of using
# kwargs only accepts strings, not bytes.
self.server.execute_command('ZADD', self.key, score, data)
#按照分值来看

def pop(self, timeout=0):
"""
Pop a request
timeout not support in this queue class
"""
# use atomic range/remove using multi/exec
##开启事物
pipe = self.server.pipeline()
pipe.multi()
##取第一个值出来,拿出一个删除一个
pipe.zrange(self.key, 0, 0).zremrangebyrank(self.key, 0, 0)
results, count = pipe.execute()
if results:
return self._decode_request(results[0])

最终pop是按照这个优先级来取值的,优先级越小的越先被取出来,优先级从小多大取值
总结:就是深度越小,优先级越小,越先被取出来>>广度优先(先进先出,横向取值)

深度优先:
先进后出:一个一个节点的往下面执行

深度越大,优先级越小,越先被pop出来

深度优先类似,就不多说了

....................

浅谈深度优先和广度优先(scrapy-redis)的更多相关文章

  1. 浅谈 OpenResty,基于opebresty+redis进行实时线上限流

    一.前言 我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开 ...

  2. scrapy分布式浅谈+京东示例

    scrapy分布式浅谈+京东示例: 学习目标: 分布式概念与使用场景 浅谈去重 浅谈断点续爬 分布式爬虫编写流程 基于scrapy_redis的分布式爬虫(阳关院务与京东图书案例) 环境准备: 下载r ...

  3. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  4. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  5. 第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理

    第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认 ...

  6. 十七 Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理

      网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认是深度优先的   广度优先 是以层级来执行的,(列队方式实现)

  7. 浅谈:Redis持久化机制(一)RDB篇

    浅谈:Redis持久化机制(一)RDB篇 ​ 众所周知,redis是一款性能极高,基于内存的键值对NoSql数据库,官方显示,它的读效率可达到11万次每秒,写效率能达到8万次每秒,因为它基于内存以及存 ...

  8. 浅谈:Redis持久化机制(二)AOF篇

    浅谈:Redis持久化机制(二)AOF篇 ​ 上一篇我们提及到了redis的默认持久化方式RDB,是一种通过存储快照数据方式持久化的机制,它在宕机后会丢失掉最后一次更新RDB文件后的数据,这也是由于它 ...

  9. 浅谈:redis的主从复制 + 哨兵模式

    浅谈:redis的主从复制 + 哨兵模式 主从模式 ​ 在谈论redis的主从复制之前,我们先回想下mysql的主从搭建过程,第一步呢首先要在主库服务器中修改my.cnf,开启一下bin_log功能, ...

随机推荐

  1. [转载]SpringMVC解决跨域问题

    本文转载自  https://www.cnblogs.com/morethink/p/6525216.html SpringMVC解决跨域问题, 感谢作者! 有个朋友在写扇贝插件的时候遇到了跨域问题. ...

  2. State management(状态管理)

    State management https://en.wikipedia.org/wiki/State_management UI控件的状态管理, 例如按钮的灰化.只读.显示隐藏等. 特殊地一个控件 ...

  3. 数据库面试题之COUNT(*),COUNT(字段),CONUT(DISTINCT 字段)的区别

    COUNT(*).明确的返回数据表中的数据个数,是最准确的 COUNT(列),返回数据表中的数据个数,不统计值为null的字段 COUNT(DISTINCT 字段) 返回数据表中不重复的的数据个数,不 ...

  4. 四十二、Linux 线程——线程同步之条件变量之线程状态转换

    42.1 线程状态转换 42.1.1 状态转换图 42.1.2 一个线程计算,多个线程获取的案例 #include <stdio.h> #include <stdlib.h> ...

  5. cocos2dx 3.3 笔记

    ccs3 加入了 rapidjson ->一个JSON解析库https://github.com/miloyip/rapidjson

  6. 关于reduce的参数问题

    ECMAScript 5还新增了两个缩小数组的方法: reduce() 和 reduceRight() .这两个方法都会迭代数组的所有项,然后构建一个最终返回的值.其中, reduce() 方法从数组 ...

  7. python 的基础 学习 第三天 编码的初始

    1  编码的初始 计算机在存储数据和传输数据的时候,都是0101的二进制. ASCII(American Standard Code for Information Interchange,美国标准信 ...

  8. 调整JVM虚拟机的内存大小

    jvm默认只有64M; public static void main(String[] args){ byte b[] = new byte[1024*1024*65];//此时会报内存溢出: } ...

  9. Create AI Guard Class

    创建FPSAIGuard类 不需要玩家输入,删除多余的函数 FPSAIGuard.h #include "CoreMinimal.h" #include "GameFra ...

  10. MySql 在cmd下的学习笔记 —— 有关用户权限的操作(grant)

    用户连接到MySQL时: [用户]   <---->   [服务器] 分为2个阶段: 1:有没有权限连接: 2:有没有执行此操作的权利.(如select, update……) 判断依据:( ...