`
128kj
  • 浏览: 583978 次
  • 来自: ...
社区版块
存档分类
最新评论

列磁盘目录(深度优先和广度优先实现)

阅读更多
    有两种常用的方法可用来搜索图:即深度优先搜索和广度优先搜索。它们最终都会到达所有连通的顶点。深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。 

深度优先搜索:
下面图中的数字显示了深度优先搜索顶点被访问的顺序。


为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则:
(1) 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。
(2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。
(3) 如果不能执行规则1和规则2,就完成了整个搜索过程。

广度优先搜索:
在深度优先搜索中,算法表现得好像要尽快地远离起始点似的。相反,在广度优先搜索中,算法好像要尽可能地靠近起始点。它首先访问起始顶点的所有邻接点,然后再访问较远的区域。它是用队列来实现的。

下面图中的数字显示了广度优先搜索顶点被访问的顺序。


实现广度优先搜索,也要遵守三个规则:
(1) 访问下一个未来访问的邻接点,这个顶点必须是当前顶点的邻接点,标记它,并把它插入到队列中。

(2) 如果因为已经没有未访问顶点而不能执行规则1时,那么从队列头取一个顶点,并使其成为当前顶点。
(3) 如果因为队列为空而不能执行规则2,则搜索结束。

下面是一个练习的简单例子:列磁盘目录(深度优先和广度优先实现)
import java.io.File;
import java.io.IOException;
import java.util.Stack;
import java.util.Queue;
import java.util.LinkedList;
public class ListFile{

        public static void main(String[] args) throws IOException {
              File file = new File("c:/java/guest");
               DFS1(file);
               System.out.println("--------------------------------");
               System.out.println("--------------------------------");
               // DFS2(file);
               BFS(file);

        }

        // 文件深度非递归遍历

        private static void DFS1(File file) throws IOException {
               Stack<File> stack = new Stack<File>();
               stack.push(file);
               File fileInStack = null;
               while (!stack.isEmpty()) {
                 fileInStack = stack.pop();
                 System.out.println("dir:" + fileInStack.getCanonicalPath());
                 File[] files = fileInStack.listFiles();
                 for (File eachFile : files) {
                    if (eachFile.isFile()) {
                        System.out.println("file:" + eachFile.getCanonicalPath());
                    } else {
                         stack.push(eachFile);

                    }
                  }

                }

        }

        // 文件深度递归遍历

        private static void DFS2(File file) throws IOException {
             System.out.println("dir:" + file.getCanonicalPath());
             File[] files = file.listFiles();
             for (File eachFile : files) {
               if (eachFile.isFile()) {
                   System.out.println("file:" + eachFile.getCanonicalPath());
               } else {
                   DFS2(eachFile);
                 
             }

          }

     }

     // 文件广度非递归遍历
        private static void BFS(File file) throws IOException{  
            System.out.println(file.getCanonicalPath());
            Queue<File> queue = new LinkedList<File>();  
            queue.offer(file);  
             File fileInQueue = null;
            while (queue.size() > 0) {  
               fileInQueue = queue.poll();  
               //System.out.println("dir--:" + fileInQueue.getCanonicalPath());
               File[] files =fileInQueue.listFiles(); 

                for (File eachFile : files) {
                    if (eachFile.isFile()) {
                        System.out.println("file:" + eachFile.getCanonicalPath());
                    } else {
                         System.out.println("dir--:" + eachFile.getCanonicalPath());
                         queue.offer(eachFile);

                    }
                }

            }  
            
       }  

}

下载源码:
  • 大小: 7.3 KB
  • 大小: 10.1 KB
分享到:
评论

相关推荐

    mini_spider:在调研过程中,经常需要对一些网站进行定向抓取。由于python包含各种强大的库,使用python做定向抓取比较简单。请使用python开发一个迷你定向抓取器mini_spider.py,实现对种子链接的广度优先抓取,并把URL长相符合特定pattern的网页保存到磁盘上

    #####使用python开发定向抓取器mini_spider.py,实现对种子链接的广度优先抓取,并把URL长相符合特定pattern的网页保存到磁盘上。程序运行:python mini_spider.py -c spider.conf#####配置文件spider.conf:[spider]...

    c语言实战105例源码

    17 广度优先搜索及深度优先搜索  18 实现基本的串操作  19 计算各点到源点的最短距离  20 储油问题  21 中奖彩球问题  22 0-1背包问题  24 二叉树算法集  25 模拟LRU页面置换算法  26 大...

    C语言实战105例 含105个源代码

    实例17 广度优先搜索及深度优先搜索 53 实例18 实现基本的串操作 59 实例19 计算各点到源点的最短距离 62 实例20 储油问题 65 实例21 中奖彩球问题 67 实例22 0-1背包问题 69 实例23 阶梯计数问题 72 ...

    《C语言实战105例》

    实例17 广度优先搜索及深度优先搜索 53 实例18 实现基本的串操作 59 实例19 计算各点到源点的最短距离 62 实例20 储油问题 65 实例21 中奖彩球问题 67 实例22 0-1背包问题 69 实例23 阶梯计数问题 72 ...

    C语言实战105例源码.rar

    实例17 广度优先搜索及深度优先搜索 53 实例18 实现基本的串操作 59 实例19 计算各点到源点的最短距离 62 实例20 储油问题 65 实例21 中奖彩球问题 67 实例22 0-1背包问题 69 实例23 阶梯计数问题 72 ...

    C语言实战105例源码

    实例17 广度优先搜索及深度优先搜索 53 实例18 实现基本的串操作 59 实例19 计算各点到源点的最短距离 62 实例20 储油问题 65 实例21 中奖彩球问题 67 实例22 0-1背包问题 69 实例23 阶梯计数问题 72 ...

    200个经典C程序【源码】

    065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译 072 火车车厢重排 073 队列实例 074 K阶斐波那契序列 第三部分 数值...

    C程序范例宝典(基础代码详解)

    实例116 图的深度优先搜索 172 实例117 图的广度优先搜索 175 实例118 Prim算法求最小生成树 177 实例119 迪杰斯特拉算法 180 第4章 算法 183 4.1 简单问题算法 184 实例120 任意次方后的最后三位 ...

    C 语言实例解析精粹(第二版)(书+盘)

    065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译 072 火车车厢重排 073 队列实例 074 K阶斐波那契序列 第三部分 数值...

    C语言实例解析精粹(第二版) 光盘代码

    065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译 072 火车车厢重排 073 队列实例 074 K阶斐波那契序列 第三部分 数值计算与趣味...

    C语言学习实例220例

    066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译 072 火车车厢重排 073 队列实例 074 K阶斐波那契序列 第三部分 数值计算与趣味数学篇 075 绘制余弦曲线...

    C语言精粹(第2版)随书关盘

    065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译 072 火车车厢重排 073 队列实例 074 K阶斐波那契序列 第三部分 数值...

    220个C源代码 初学C语言必备

    065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译 072 火车车厢重排 073 队列实例 074 K阶斐波那契序列 第三部分 数值...

    C源代码实例集

    042 插入排序 043 希尔排序 044 冒泡排序 045 快速排序 ...和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置 057 运动会分数统计 058 双链表 059 约瑟夫环 ...

    good-coder-python:优秀的python编码器

    请使用python开发一个迷你定向抓取器mini_spider.py,实现对种子链接的广度优先抓取,并把URL长相符合特定pattern的网页保存到磁盘上。程序运行:python mini_spider.py -c spider.conf###配置文件spider.conf:...

    C语言经典源代码实例 数据结构 操作系统 图形等

    065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译 072 火车车厢重排 073 队列实例 074 K阶斐波那契序列 第三部分 数值...

Global site tag (gtag.js) - Google Analytics