双向广度优先搜索(介绍)

2023-11-16

双向广度优先搜索

  广度优先搜索遵循从初始结点开始一层层扩展直到找到目标结点的搜索规则,它只能较好地解决状态不是太多的情况,承受力很有限。如果扩展结点较多,而目标结点又处在较深层,采用前文叙述的广度搜索解题,搜索量巨大是可想而知的,往往就会出现内存空间不够用的情况。双向搜索和A算法对广度优先的搜索方式进行了改良或改造,加入了一定的“智能因素”,使搜索能尽快接近目标结点,减少了在空间和时间上的复杂度。

  (1)搜索过程
  有些问题按照广度优先搜索法则扩展结点的规则,既适合顺序,也适合逆序,于是我们考虑在寻找目标结点或路径的搜索过程中,初始结点向目标结点和目标结点向初始结点同时进行扩展—,直至在两个扩展方向上出现同一个子结点,搜索结束,这就是双向搜索过程。出现的这个同一子结点,我们称为相交点,如果确实存在一条从初始结点到目标结点的最佳路径,那么按双向搜索进行搜索必然会在某层出现“相交”,即有相交点,初始结点一相交点一目标结点所形成的一条路径即是所求路径。
  例如:移动一个只含字母A和B的字符串中的字母,给定初始状态为(a)表,目标状态为(b)表,给定移动规则为:只能互相对换相邻字母。请找出一条移动最少步数的办法。

[AABBAA]  [BAAAAB] 
 (a)       (b)
  解题分析 :从初始状态和目标状态均按照深度优先搜索扩展结点,当达到以下状态时,出现相交点,如图1(a),结点序号表示结点生成顺序。
双向扩展结点:
                   顺序                           逆序
                    1                              1
               ___AABBAA___                      BAAAAB
          2   /            /  3                2 /    / 3
      __ABABAA__            AABABA           ABAAAB  BAAABA
   4 /    |5    / 6       7 /    / 8       4 /
ABBAAA  BAABAA  ABAABA  AAABBA  AABAAB    AABAAB
                 (a)            图1               (b)

  顺序扩展的第8个子结点与逆序扩展得到的第4个子结点就是相交点,问题的最佳路径如图2。


    [AABBAA]—[AABABA]—[AABAAB]—[ABAAAB]—[BAAAAB]

                          图2


  从搜索的结点来看,双向广度要简单得多。假设每一个子结点可以扩展的子结点数是X,不计约束条件,以完全X叉树计算,那么用广度优先搜索一个长度为I的最佳路径的解,共需要扩展结点X(XL-1)÷(X-1)。从双向搜索来看,设正个方向的搜索在第y层找到向交点,那么正向共搜索了X(XY-1)÷(X-1),逆向扩展的结点数为(XL-y-1)÷(X-1),两个方向共搜索了 X(XY+XL-Y-2)÷(X-1)。我们假设L为偶数,则Y=L/2,双向搜索扩展的结点数约为单向搜索的2÷(XL/2+1)*100%,相对减少(XL/2-1)÷(XL/2+1)*100%。
  当然这里只是作个粗略的比较,事实上在其它一般情况下,双向搜索搜索量都要比单向搜索来的少。

  (2)结点扩展顺序
    双向扩展结点,在两个方向的扩展顺序上,可以轮流交替进行,但由于大部分的解答树并不是棵完全树,在扩展完一层后,下一层则选择结点个数较少的那个方向先扩展,可以克服两个方向结点生成速度不平衡的状态,明显提高搜索效率。

  (3)数据结构
    单向广度优先搜索需建立两个表OPEN和CLOSED,用来存储生成结点和已扩展结点,双向搜索从两个方向进行扩展,我们建立两个二维表OPEN,CLOSED,OPEN[1],CLOSED[1], OPEN[2],CLOSED[2]分别存储两个方向上的生成结点和已扩展结点,OPEN仍然是具有“先进先出”的队列结构。为编程方便,我们采用基于广度优先搜索算法的双向,建立三个二维指针:Q1,Q2,Q3其作用如下:
    Q1[1],Q1[2]:分别指向两个方向上当前待扩展层的第一个结点。
    Q2[1],Q2[2]:分别指两个方向上队尾新产生的结点。
    Q3[1],Q3[2]:分别指向两个方向上下一层的第一个结点位置。
    为了区分当前搜索方向,设方向标志:
    t=1表示处于正向搜索,t=2表示处于逆向搜索。
    Fail—有一个方向搜索失败时,为真,并且结束搜索过程,否则为假。
    I—全局变量,指向当前要扩展的结点。

  (4)算法描述

Program DOUBFS;
    初始化,初始结点,和目标结点分别进入OPEN[1]和OPEN[2]表;
    Q1[1]:=1;Q2[1]:=1;Q1[2]:=1;Q2[2]:=1;
    repeat
      if (Q2[1]-Q1[1])<=(Q2[2]-Q1[2]) then t:=1
      else t:=2;
      for I:=Q1[t] to Q2[t] do
        EXPEND(t);{扩展第1个结点}
      Q1[t]:=Q3[t];
    until(Q1[t]>Q2[t]);
    其中过程EXPEND(t)的结构如下:
  Procedure expand(t:integer);
  Var j:integer;
  begin
      for j:=1 to n do {n为最多后继状态数}
      begin
    产生i点的第j个后继状态,将它加入到队尾(Q2[t]+1);
    if新结点未与其上一层以上的所有点重复
    then if isans(t) then [输出解;halt;] else
    else将新点从队列中去掉;(Q2[t]-1)
      end;    -
  end;
    判断是否是相交点的过程isans(t)如下:
  function isans(t:integer):Boolean;
  var j,t1:integer;
  begin
    if t=1 then t1:=2 else t1:=1;
    isans:=false;
    forj:=Q1[t1] to Q2[t1] do
    if Q2[t]=j {Q2[t]新结点是相交点}
    then [isans:=true;exit];
  end;

(5)例题应用
    【例1】魔方问题
    在魔方风靡全球之后,Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方块组成,每个方块的颜色均不相同,本题中以数字1—8分别表示,可能出现在魔板的任一位置,任一时刻魔板的状态可以用方块的颜色序列表示:从魔板的左上角开始,按顺时针方向依次写下各方块的颜色代号,得到的数字序列即可表示此时魔板的状态。
    例如,序列(1,2,3,4,5,6,7,8)表示题中魔板的初始状态。

 1 2 3 4
 8 7 6 5
  对于魔板,可以施加三种不同的操作,分别以A,B,C标识。
    具体操作方法如下:
    A:上下行互换,如上图可以变换为状态87654321
    B:每行同时循环右移一格,如上图可以变换为41236785
    C:中间4个方块顺时针旋转一格,上图可以变换为17245368。
    应用这三种基本操作,可以由任一状态达到任意另一状态。
    子任务A:
    请编一程序,对于输入的一个目标状态,寻找一种操作的序列,使得从初始状态开始,经过此操作序列后使该魔板变为目标状态。
    子任务B:
    如果你的程序寻找到的操作序列在300步以内,会得到子任务B的分数。
    输入数据:
    文件名INPUT.TXT,第一行包含8个以一个空格相隔的正整数,表示目标状态。
    输出数据:
    输出文件名为OUTPUT.TXT,在第一行输出你的程序寻找到的操作序列的步数L,随后L行是相应的操作序列,每行的行首写一个字符,代表相应的操作。
    【算法分析】
A.空间复杂度如果解的步数为n,则状态表示空间约占3 n
B.基本算法本题是典型的广度优先算法题,很自然的想到能否构造启发算法。但本题不同于八数码,很难找到一个估价函数。因为每一种状态的达到都有三种本质不同的方法,因此在计算某一状态的估价值时,容易将状态各个数字的最少移动步数重复计算,或忽略计算,不能够构造出一个恰当函数f*使得f*< f。因此不宜采用启发算法得出最优解,而只能得可行解。现在考虑双向广度优先搜索。
双向搜索与单向广度搜索相比的优点在于节省了存储空间,避免搜索出更多的无用结点,提高丁搜索速度,如果采用动态数组存储(655 350Byte)可以做到大约21~22步,甚至可以更多。
    【参考程序】
Program Rubic;
Uses Crt;
Const
  n=8;
  input = 'input.txt';
Type
  dar = record
     f: integer;
     d: array[1..n] of Integer;
  End;
Var
  Cab: array[1..2,1..7500] of ^dat;
   dat1,dat2: dat;
Procedure Init;
Var
   f: text;
   i,i: Integer;
Begin
   assign(f, input);
   reset(f);
   new(cab[1,1]);
   for I:=1 To n do
     read(f,cab[1,I]^.d[i]);
   cab[1,1]^.f := 0;
   readln(f);
   new(cab[2,1 ] );
   for I := 1 tondo
      read(f,cab[2,1]^.d[i]);
   readln(f);
   cab[2,1]^.f := 0;
 End;
 Function Check(x,y: Integer) :boolean;
 Var
  i,j,k: Integer;
  ok: Boolean;
Begin
  for i:= 1 to y-1 do
    Begin
      forj := 1 to n do
        if cab[x,i]^.d[j] < > dat1.d[j] then
        Begin
          ok := true;
          Break;
        End else Ok:= false;
      if not ok then break;
    End;
  Check := ok;
End;
Function CheckOut(X,Y: Integer;Var a: Integer): Boolean;
Var
   i,j,k: Integer;
   ok: Boolean;
Begin
  a:=0;
  fori := 1 to y do
    Begin
      for j := 1 to n do
        if cab[x,i]A.d[j] < > dat1.d[j] then
        Begin
          ok := true;
          Break;
        End else Ok: = false;
      if not ok then
        Begin
          a:= i;
          break;
        End;
    End;
  CheckOut := ok;
End;
Procedure Print(a,b,c: Integer);
Var
   i,j,k,l: Integer;
   s1,s2: array[1..30] of Integer;
   x,y: Integer;
Begin
  fillchar(s1,sizeof(s1), 0);
  fillchar(s2,sizeof(s2) ,0);
  if a = 1 then
  Begin
     i:=1;
     j:=2;
  End else
  Begin
     i:=2;
     j:=1;
  End;
  k:= O;
  Repeat
    inc(k);
    s1[k] := b;
    b := cab[i,b]^.f;
  Until b = 0;
  l:= 0;
  Repeat
    inc(l);
    s2[l] := c;
  c := cab[j,c]^.f;
Until c = 0;
if a = 1 then
  begin
    for x := k downto 1 do
      Begin
        for y := 1 to n do
          write(cab[1,s1[x]]^.d[y]: 3);
        if y mod 4 = 0 then writeln;
      End;
    writeln('-----');
    Readln;
  End;
  for x := 2 to l do
    Begin
      for y := 1 to n do
        Begin
          write(cab[2,s2[x]]^.d[y]: 3);
          if y mod 4 = 0 then writdn;
        End;
      writeln('-----');
      Readln;
    End;
  End
else
  Begin
    for x := l downto 1 do
      Begin
        for y := 1 to n do
          write(cah[1,s2[x]]^.d[y]: 3);
          if y mod 4 = 0 then writdn;
      End;
      writeln('-----');
      Readln;
  End;
  for x := 2 to k do
    Begin
      for y:= 1 to n do
        begin
          write(cab[2,s1[x]]^.d[y]: 3);
          if y mod 4 = 0 then writeln;
        End;
        writeln('-----');
        Readln;
    End;
  End;
  Halt;
End;
Procedure Double;
Var
  i,j: array[1..2] of Integer;
  Out: Boolean;
  k,l,kk,s: Integer;
  i[1] := 1;
  i[2] := 1;
  j[1] := 2;
  j[2] := 2;
  Out := false;
  repeat
     kk:=2;
     k:=1;
{--1--}
dat1.d := Cab[k,i[k]]^.d;
for l := 1 to 4 do
  Begin
     dat1.d[l] := dat1.d[l+4];
     dat1.d[l+4] := cab[k,i[k]]^.d[l];
  End;
dat1.f := i[k];
if Check(k,j[k]) then
  Begin
    new(mb[kd[k]]);
    mb[kd[k]]^:= dat1;
    inc(j[k]);
    if Not CheckOut(kk,j[kk] - 1,s) then Print(k,j[k] - 1 ,s);
  End;
{--2--}
dat1.d := Cab[k,i[k]]^.d;
dat1.d[3]: = dat1.d[2];
dat1.d[2] := dat1.d[5];
dat1.d[5] := dat1.d[6];
dat1.d[6] := cab[k,i[k]]^.d[3];
dat1.f: = i[k];
if Check(k,j[k])  then
  Begin
    new(cab[k,j[k]]);
    cab[k,j[k]]^ := dat1;
    inc(j[k]);
    if NOt CheckOut(kk,j[kk] - 1,s) then Print(k,j[k] - 1,s);
  End;
{--3--}
dat1.d:= Cab[k,i[k] ]^.d;
dat1.d[4]: = dat1.d[3];
dat1.d[3]: = dat1.dj2];
dat1.d[2] := dat1.d[1];
dat1.dj1] := cab[k,i[k]]^.d[4];
dat1.f := i[k];
if Check(k,j[k]) then
  Begin
     new(cab[k,j[k]]);
     cab[k,j[k]]^:= dat1;
     inc(j[k]);
     if Not CheckOut(kk,j[kk]- 1,s) then Print(k,j[k] - 1,s);
  End;
Inc(i[k]);
kk:= 1;
k:=2;
{--1--}
dat1.d := Cab[k,i[k]]^.d;
for l := 1 to 4 do
  Begin
     dat1.d[l] := dat1.d[l+4];
     dat1.d[l+4] := cab[k,i[k]]^.d[l];
  End;
  dat1.f:= i[k];
  if Check(k,j[k]) then
    Begin
       new(cab[k,j[k] ]);
       cab[k,j[k]]^:= dat1;
       inc(j[k]);
       if Not CheckOut(kk,j[kk] - 1 ,s) then Print(k,j[k] - 1 ,s);
    End;
{--2--}
dat1.d := Cab[k,i[k]]^.d;
daft. d[2] : = dat1. d[3];
       dat1.d[3] := dat1.d[6];
       dat1.d[6]: = dat1.d[5];
       dat1.d[5] := cab[k,i[k]]^.d[2];
      dat1.f: = i[k];
      if Check(k,j[k]) then
         Begin
            new(cab[k,j[k]]);
            cab[k,j[k]]^:= dat1;
            ine(j[k]);
            if Not CheckOut(kk,j[kk] - 1 ,s) then Print(k,j[k] - 1 ,s);
         End;
     {---3---}
      dad.d:= Cab[k,i[k]]^.d;
      dat1.d[1] := dat1.d[2];
      dat1.d[2] := dat1.d[3];
      dat1.d[3] := dat1. d[4];
      dat1.dj4] := cab[k,i[k] ]^.d[1];
      dat1.f := i[k];
      if Check(k,j[k]) then
      Begin
        new(cab[k,j[k]]);
        cab[k,j[k]]^ := dat1;
        inc(j[k]);
        if Not CheckOut(kk,j[kk] - 1,s) then Prim(k,j[k] - 1,s);
        End;
     Inc(i[k]);
   until Out;
End;
Begin
  INit;
  clrscr;
  Double;
End.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双向广度优先搜索(介绍) 的相关文章

  • websocket详解

    之前利用websocket以及jQuery做了一个聊天通讯应用 最近在总结整个过程中的一些问题 也借此机会聊聊websocket协议 webSocket本身不存在跨域问题 所以可以利用webSocket来进行非同源之间的通信 webSock
  • pytorch打印模型梯度

    简介 有时候在调试模型训练过程时 我们需要打印模型中参数的梯度 去查看是否存在梯度消失或者梯度爆炸的问题 可以通过在backward之后查看params的grad属性来确认 参考代码如下所示 import torch 定义模型 class
  • Python3 面向对象编程

    好记性不如烂笔头 对之前阅读书籍进行梳理与总结 此文为 Python3面向对象编程 阅读笔记 文章目录 第一章 面向对象设计 第二章 Python对象 第三章 对象相似时 第四章 异常捕获 第五章 何时使用面向对象编程 第六章 Python
  • C# 导出 Excel 方法

    第一种 使用 Microsoft Office Interop Excel dll public void ExportExcel DataTable dt if dt null Microsoft Office Interop Excel
  • 关键词生成器在线-在线免费关键词生成器

    关键词生成 什么是关键词生成 关键词生成就是根据你输入的一个关键词生成成千上百的核心关键词 围绕着你输入的核心词来生成的 优先生成大量用户搜索的关键词 今天就给大家分享一款免费关键词生成工具 关键词生成的来源主要是用户都在搜索的词 相关搜索
  • CentOS-8-x86_64-1905安装

    CentOS 8 x86 64 1905安装 安装前准备 VMware Workstation 点击下载虚拟机软件 VMware Workstation是一款功能强大的桌面虚拟计算机软件 提供用户可在单一的桌面上同时运行不同的操作系统 和进
  • Crazy Thairs【树状数组+高精度+DP思想】

    题目链接 POJ 3378 题意 有N个点 问的是要求组成一个长度为5的上升子序列的组成有多少种 最搞事情的是这道题不用取模 所以 是一定会爆long long的 首先 很容易想到一点就是我们可以开一个dp maxN 5 表示的是 dp i
  • Vagrant学习笔记:搭建K8s集群

    通常情况下 我们在使用VMware VirtualBox这一类虚拟机软件创建虚拟开发环境时 往往需要经历寻找并下载操作系统的安装镜像文件 然后根据该镜像文件启动的安装向导一步一步地安装与配置操作系统 最后还需要从零开始安装开发与运维工具 整
  • 计算机考研复试机试怎么速成,西安电子大学计算机考研复试机试(2019)+ 学长讲解(6)+ 作业...

    学长讲的就是算法笔记的入门算法 作业1 链接 https www nowcoder com questionTerminal 0f64518fea254c0187ccf0ea05019672 来源 牛客网 有一个网络日志 记录了网络中计算任
  • Java各种集合判空总结

    目录 集合判空 CollectionUtils isEmpty推荐 原始判断 isEmpty 其他 数组判空 集合判空 CollectionUtils isEmpty推荐 这个使用到了spring的工具类 需要提前引入依赖 import o
  • 机器学习2018-12-28

    机器学习 组成 主要任务 分类 classification 将实例数据划分到合适的类别中 应用实例 判断网站是否被黑客入侵 二分类 手写数字的自动识别 多分类 回归 regression 主要用于预测数值型数据 应用实例 股价价格波动的预
  • 用编程器免拆夹子刷斐讯K2 K2P解决难搞固件 刷BREED 无损原EEPROM

    文章中放的几个地址都是思路来源 感谢各路大神原帖子的思路 因为我刷机时候没有拍照 只好借用各位大佬的图来说明步骤 我做一下整理会放出本篇刷机流程 很简单 K2 22 6 532 231软件版本已经无解 UBOOT等可以软刷的方式都被堵死 编
  • .NET编程——利用C#实现TCP协议的异步通信Socket套接字(WinForm)

    本文将介绍利用基于TCP通信协议的Socket实现服务器与客户端之间的数据传输 目录 前言 计算机通信 创建服务器 服务器通信 创建客户端 客户端通信 前言 TCP IP Transmission Control Protocol Inte
  • 【编码-校验码】奇偶校验码

    https zhuanlan zhihu com p 26509678 引自原文 1 定义 奇偶校验位 英语 Parity bit 或校验比特 check bit 是一个表示给定位数的二进制数中1的个数是奇数还是偶数的二进制数 奇偶校验位是
  • 炫酷的Android智能下拉刷新框架,值得一看

    1 Android智能下拉刷新框架 SmartRefreshLayout 支持所有的 View AbsListView RecyclerView WebView View 和多层嵌套的视图结构 支持自定义并且已经集成了很多炫酷的 Heade
  • BRDF详解

    光照模型主要分为三类 测量模型 经验模型和基于物理的分析模型 在计算机图形学中介绍的光照模型为经验模型中的Phong模型 也就是本人理解的 根据点距光源的位置 入射角度等信息计算的 反射强度 包括漫反射强度 镜面反射强度 但是Phong模型
  • 《effective c++》笔记

    序 1 object 在 object oriented技术中的真正意义是 物件 物体 而非 对象 目标 导读 1 术语 1 声明式 告诉编译器名称和类型 但略去细节 std size t numDigit int number std命名

随机推荐

  • 软工导论知识框架(六)面向对象分析

    前言 绘制各种类型的图是重点 对于面向对象建模中需要绘制的图总结在第五期中 软工导论知识框架 五 面向对象方法学 一 分析过程 1 获取需求 与用户交谈 向用户提问题 参观用户的工作流程 观察用户的操作 向用户群体发调查问卷 与同行 专家交
  • 【满分】【华为OD机试真题2023 JAVA&JS】查找重复代码

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 查找重复代码 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复
  • 使用IntelliJ IDEA查看类的继承关系图形

    最近正好也没什么可忙的 就回过头来鼓捣过去的知识点 到Servlet部分时 以前学习的时候硬是把从上到下的继承关系和接口实现记得乱七八糟 这次利用了IDEA的diagram 结果一目了然 也是好用到炸裂 就此分享 1 查看图形形式的继承链
  • Golang基础 流程控制 条件判断

    条件判断 01 条件判断 if 02 分支选择 switch 03 异步处理 select 参考资料 条件语句一般指定一个或多个条件 并通过测试条件是否为 true 来决定是否执行指定语句 并在条件为 false 的情况在执行另外的语句 0
  • 你得学会并且学得会的Socket编程基础知识

    这一篇文章 我将图文并茂地介绍Socket编程的基础知识 我相信 如果你按照步骤做完实验 一定可以对Socket编程有更好地理解 本文源代码 可以通过这里下载 http files cnblogs com chenxizhang Socke
  • xLua游戏中的热更新(基于Unity2018)

    什么是热更新 热 就是刚出炉 简单来说就是当游戏某个功能出现bug 或者修改了某个功能 或者增加了某个功能的时候 我们不需要重新下载安装安装包 就可以更新游戏内容 热更新的好处 不用浪费流量重新下载 不用通过商店审核更加快速 不用重新安装玩
  • STM32+M5311对接 OneNET 项目记录

    以前做过的一个演示项目 一款判断人体进出的语言播报方案 通过LwM2M 协议连接 OneNET 硬件平台 M5311 STM32F103 云平台 中国移动 OneNET 语音芯片 WT 唯创知音 WT588D 传感器探头 SHARP 夏普
  • java中String类型转Map类型

    import com alibaba fastjson String str HashMap hashMap JSON parseObject str HashMap class
  • 生活是一种习惯

    生活是一种习惯 昨天看到一天文章 贫穷的理由 让我想到很多 我从家乡出来 来到北京 根据自己的亲身体会 人要养成一个好的习惯 善于学习 不安于现状的习惯 人活着 要想活出个样了 非大众化的人生 就要不安于现状 不要让自己养成满足的习惯 要不
  • [1048]python base64与hex相互转换

    base64转hex coding utf 8 Python 2 import base64 text woidjw b64 hex base64 b64decode text encode hex print b64 hex b64 he
  • C语言学习

    目录 调试 基本概念 bug 调试 debug 调试步骤 Debug和Release VS是集成开发环境 IDE 调试的快捷键 调试窗口 监视 减少程序的错误 assert 表达式 const 变量 调试 基本概念 bug 虫子 bug引申
  • 梦之光芒ctf小游戏闯关过程

    梦之光芒ctf游戏闯关 简介 玩这个游戏 您需要有JS 编码解码 XSS SQL注入 图片隐写 逆向分析等基本常识 游戏地址 http monyer com game game1 进入第1关 入口提示 请点击链接进入第1关 连接在左边 连接
  • max_binlog_size

    max binlog size 默认就是一个G最大值 但是有有什么会发现超过了一个G 原因就是 If a write to the binary log causes the current log file size to exceed
  • java application.yml 配置对象数组

    java application yml 配置对象数组 application yml 配置对象数组 常规对象中获取属性 场景 application yml 配置对象数组 定义配置文件结构 用于定义配置文件的数据结构 打印服务中用到的打印
  • Thinkpad在linux(ubuntu)下修改电池充电阈值,成功解决Thinkpad在Linux下的电池充电问题

    look this for more info http www thinkwiki org wiki Tp smapi 安装tp smapi aptitude install tp smapi dkms modprobe tp smapi
  • Kubernetes弃用Docker的由来和始末

    2020年12月初 Kubernetes在发布v1 20的时候重磅宣称将逐渐弃用Docker 一石激起千层浪 瞬间引爆容器圈 但没想到已经过去两个月时间了 还有文章用UC体误导吃瓜群众 还在学Docker Docker已死 额 累了 毁灭吧
  • mysql join 自己_用JOIN自己更新MySql

    HI我有查詢選擇了主鍵 id 1或外鍵 1的所有行 這是自己的連接 用JOIN自己更新MySql 選擇 SELECT f2 wz AS wz FROM d7x6r magazyn faktura zakupowa f LEFT JOIN S
  • 强化学习——基本概念

    什么是强化学习 强化学习关注与智能体 agent 如何与环境交互中不断学习以完成特定的目标 与有监督学习相比 不需要告诉智能体数据以及对应的标签 学习相应的模型 而是需要智能体在环境中一次次学习 哪些数据对应哪些标签 从而学习规律知道策略
  • Oracle 数据导入*.sql 提示ORA-01950

    今天执行远程Oracle 数据库数据导入时 提示ORA 01950 超出导入文件大小限制 cmd 远程连接oracle 数据库 sqlplus root root1234 192 50 68 246 orcl 导入指定位置的 sql文件 E
  • 双向广度优先搜索(介绍)

    双向广度优先搜索 广度优先搜索遵循从初始结点开始一层层扩展直到找到目标结点的搜索规则 它只能较好地解决状态不是太多的情况 承受力很有限 如果扩展结点较多 而目标结点又处在较深层 采用前文叙述的广度搜索解题 搜索量巨大是可想而知的 往往就会出