精华内容
下载资源
问答
  • (C++)通过深度优先搜索得到无向图中的所有连通分量 我们知道一个图的极大连通子图是这个图的连通分量,而一个连通图只有一个连通分量,就是图本身。本篇的内容是DFS的应用之一:找到一个图中所有的连通分量,代码...

    (C++)通过深度优先搜索得到无向图中的所有连通分量

    我们知道一个图的极大连通子图是这个图的连通分量,而一个连通图只有一个连通分量,就是图本身。本篇的内容是DFS的应用之一:找到一个图中所有的连通分量,代码参考《算法》第四版。

    一.构造一个无向图

    从本篇开始,我使用模版图类来表达一个无向图,图类及相关函数声明如下所示:

    /* 节点类,图的节点数据类型可以任意给定 */
    template<typename VertexType> class Vertex_new
    {
    public:
        Vertex_new(VertexType val)
        {
            in_out = 0;
            value = val;
        }
        VertexType value;
        int in_out;
        list<Vertex_new<VertexType> *> neighbours;
    };
    
    
    
    
    /* 模版图类,图的节点数据类型可以任意给定 */
    template<typename VertexType> class undirectGraph_new
    {
    public:
        /*************************************************
        Function:   undirectGraph_new
        Description:    依据txt中对图的描述,对图进行初始化操作
        Calls:          addEdge
        Input:          string path 一个路径字符串
        Output:       一张可以代表每个节点连接情况的邻接表
        *************************************************/
        undirectGraph_new(string path);
        
        /*************************************************
        Function:   countOfVertex()
        Description:    一般在初始化后调用,用于返回图的节点数量
        Return:   int 类型的数据,代表节点数量
        *************************************************/
        int countOfVertex();
        
        /*************************************************
        Function:   countOfEdge()
        Description:    一般在初始化后调用,用于返回图的节点的边数数量
        Output:      int 类型的数据,代表边的数量
        *************************************************/
        int countOfEdge();
        
        /*************************************************
        Function:   addEdge
        Description:    一般在初始化图时使用,作用是根据具体情况,将节点加入邻接表
        Calls:          isInserted
        Input:          两个VertexType A和B ,代表两个节点的值
        *************************************************/
        void addEdge(VertexType firstVertex, VertexType secondVertex);
        
        /*************************************************
        Function:   print_allVertexAndEdge
        Description:    打印图的结构
        Output:      图中的每个节点及节点对应的邻居节点
        *************************************************/
        void print_allVertexAndEdge();
        
        /*************************************************
           Function:   isInserted
           Description:   判断一个节点的值是否已经是邻接表的某一个key(即判断这个节点是否已经被初始化)
           Input:          一个VertexType类型的节点值
           *************************************************/
        bool isInserted(VertexType v);
        
        
        //connectedComponent
        
        /*************************************************
           Function:   findConnectComponent
           Description:    找到图中的连通分量,并保存在id_cc当中
           *************************************************/
        void findConnectComponent();
        /*************************************************
           Function:   printConnectComponent
           Description:   打印连通分量
           *************************************************/
        void printConnectComponent();
        
        /*************************************************
           Function:   connected
           Description:    判断两个节点是否在一个连通分量里,  该函数需要在调用findConnectComponent()之后才有效
           Input:          两个value为VertexType 类型的顶点v和w
           *************************************************/
        bool connected(Vertex_new<VertexType> v, Vertex_new<VertexType> w);
        
        /*************************************************
           Function:   countOfCC()
           Description:    获得连通分量的个数
           Return:   int类型,连通分量的个数
           *************************************************/
        int countOfCC();//连通分量的个数
        
        
        /*************************************************
              Function:   id
              Description:    获得某顶点的连通分量id
              Return:   int类型,连通分量id
              *************************************************/
        int id(VertexType v);
          
    private:
        
        /*************************************************
        Function:   initialVertexMarked_cc
        Description:    初始化每个节点的检测状况,全部初始化为“未检测”状态
        *************************************************/
        void initialVertexMarked_cc();
        
        /*************************************************
           Function:   isMarked_cc
           Description:   判断一个节点是否已经被检测
           Return:   返回true/false
           *************************************************/
        bool isMarked_cc(VertexType v);
        
        /*************************************************
        Function:   dfs_cc
        Description:   为连通算法专用的深度优先搜索,在搜索过程中记录路径上的点并赋予其连通分量id
        *************************************************/
        void dfs_cc(VertexType v);
        
        
        int m_countOfVertex;//顶点数
        int m_countOfEdge;//边数
        int cc_id;//代表在图中检测到的节点数
        map<VertexType, Vertex_new<VertexType>* > VertexSet;//邻接矩阵
        vector<vector<int> > m_GraphMatrix;
        multimap<int, VertexType> id_cc;//按所属的连通分量组id来存储各节点
        map<VertexType, bool> VertexMarked_cc;//VertexMarked_cc存储了各节点是否已经被访问过的信息,true代表访问过,VertexType代表节点的值
    };
    
    

    具体实现在GitHub,查看第169行到569行Graph_practise.hpp

    二.测试用例

    在这里插入图片描述

    本篇所用的图结构如图上所示(算法书上的图例子),通过一个txt文件可以很容易生成这个图,很明显这里有三个连通分量。

    我们的目的就是通过深度搜索,找到图中的这三个连通分量

    在搜索之前,声明一个变量cc_id,代表连通分量的ID,图中的每个节点,都有属于自己的连通分量ID。在搜索前,将cc_id置为0,代表第一个连通分量ID为0。

    三.通过DFS找到连通分量
    1. 首先我们可以创建一个能够监控“节点是否被访问过”的数据结构,这里使用了map<VertexType, bool> 前一个参数VertexType代表某节点的值, 第二个bool类型参数代表节点是否被访问。在搜索之前,我们需要初始化一下这个数据结构,使所有节点的访问状态都置为False
    template<typename VertexType> void undirectGraph_new<VertexType>::initialVertexMarked_cc()
    {
       typename map<VertexType, Vertex_new<VertexType>* >::iterator iter = VertexSet.begin();
       for(iter; iter != VertexSet.end(); iter++)
       {
       //借助邻接表来查看有哪些节点需要初始化
       VertexMarked_cc.insert(pair<VertexType, bool>(iter->first, false));
       //iter->first 就是邻接表中代表节点Value的部分。
       //邻接表的某一行为: 节点A的值 : 节点A对象(包含节点A的邻居)
       }
    }
    
    1. 接着遍历每个节点,查看是否已经被访问,如果没有,则递归地调用深度搜索函数(从某个节点开始一直深入,直到没有与最开始的节点连通的路径)。从一个节点开始递归地进行深度搜索,最后得到的就是一个图内极大的连通子图(连通分量),因此从一个节点搜索完毕后,所做的事情就是把搜索路径上所有节点都标记为同一个连通分量ID。最开始调用的DFS递归函数在最后返回后,使cc_id更新,意味着上一个ID的连通分量已经寻找完毕,接着寻找下一个cc_id
    //查找连通分量
    template<typename VertexType> void undirectGraph_new<VertexType>::findConnectComponent()
    {
       cc_id = 0;
       initialVertexMarked_cc()//初始化VertexMarked_cc
       template map<VertexType, Vertex_new<VertexType>* >::iterator iter = VertexSet.begin();
       for(iter; iter != VertesSet.end(); iter++)
       {
          if(!isMarked_cc(iter->first))
          {
            dfs_cc(iter->first);
            cc_id++;
          }
       }
    }
    //判断某节点是否已经被访问
    template<typename VertexType> bool undirectGraph_new<VertexType>::isMarked_cc(VertexType v)
    {
        return true == VertexMarked_cc.find(v)->second;
    }
    //DFS算法 标记连通分量ID
    template<typename VertexType> void undirectGraph_new<VertexType>::dfs_cc(VertexType v)
    {
       typename map<VertexType, bool>::iterator iter = VertexMarked_cc.find(v);
       iter->second = true; //标记该节点已经被访问
       id_cc.insert(pair<int, VertexType>(cc_id, v));
       template list<Vertex_new<VertexType> *>::iterator VertexIter = VertexSet.find(v)->second->neighbours.begin();
       //这里的作用是找到一个v节点的邻居节点,方便从邻居节点开始继续递归地深度搜索,这里可能写的太复杂了,可以在GitHub里查看图的构造。
       for(VertexIter; VerterxIter != VertexSet.find(v)->second->neighbours.end(); VertexIter++)
       {
           if(!isMarked_cc((*VertexIter)->value))
           {
            //如果邻居节点还是没有被检测过,则继续搜索
            dfs_cc((*VertexIter)->value))
           }
       }
    }
    

    最后可以写一个打印函数,来展示我们找到的所有连通分量

    template<typename VertexType> void undirectGraph_new<VertexType>::printConnectComponent()
    {
     for(int i = 0; i < cc_id; i++)
        {
            typename multimap<int, VertexType>::iterator iter_lower =id_cc.lower_bound(i);
            typename multimap<int, VertexType>::iterator iter_upper =id_cc.upper_bound(i);
            cout << "连通分量" << i <<" 的节点:";
            for(auto iter = iter_lower; iter != iter_upper; iter++)
            {
                cout << iter->second << ", ";
            }
            cout << endl;
        }
    }
    

    这里使用multmap是为了让相同key的pair也能存在于同一个容器中。调用上面的printConnectComponent()函数的运行结果如下图所示。
    在这里插入图片描述
    结果和测试用例中的图结构是对应的。还有一些其他的方法,比如查看连通分量的个数、判断两个节点是否属于同一个连通分量以及查看某节点连通分量的ID等,比较简单,不写出来占地方了,已经上传到GitHub。

    下一篇会继续记录 图算法的学习

    展开全文
  • 数据结构 链表 在内存的 不一定是物理线性的。 只能顺序访问。 插入,删除,增加, 双向链表 数组 百度一下,你就知道。下标从零开始。...哈希 ...首先 将数据哈希函数计算后,得到哈希值,4999 然

    数据结构

    二叉树
    二叉树的遍历方法:广度 深度。层次遍历。

    链表

    链表是最基本的线性数据结构。特点:逻辑上连续,物理(内在地址)上不一定连续。
    在java中可以使用引用来实现结点的联结。c++直接用。
    image-20200921174502301

    在内存的 不一定是物理线性的。

    只能顺序访问。 插入,删除,增加,

    双向链表

    链表反转:

    =修改指针的指向
    1>2> 3> 4> 5 变成 5> 4> 3> 2> 1

    数组

    An array is a container object that holds a fixed number of values of a single type. The length of an array is established when the array is created. After creation, its length is fixed. You have seen an example of arrays already, in the main method of the “Hello World!” application. This section discusses arrays in greater detail.
    Each item in an array is called an element, and each element is accessed by its numerical index. As shown in the preceding illustration, numbering begins with 0. The 9th element, for example, would therefore be accessed at index 8.
    在这里插入图片描述

    本质:一个顺序存储的线性表。可以用于存储多个数据。第个数据称 为 数组元素。
    在java 中数组是一种引用类型。
    数组初始化,无论是静态还是动态创建 ,都要指定长度
    静态: 是直接赋好值。动态是 :先指定长度,运行时再填数据。
    动态长度都 是链表,或者集合类型的数组。
    百度一下,你就知道。下标从零开始。因为物理原因。速度是最快的。随机访问。

    image-20200921175529332

    先进看后出

    弹出,压入。

    队列

    FIFO 。百度吧。

    哈希表

    通常与k -v 储存。

    hashmap(key) 传入key 取出value .

    普通的储存的话。 一般是线性搜索 找到目标key ,时间与数据量成正比。哈希解决了这个问题

    下面 size=4的数组:

    image-20200921181602481

    1. 首先 将数据哈希函数计算后,得到哈希值,4999

    2. 然后再取mod 5 =4.所以存入位置4

    3. 这样,取出数据的时候对key 进行hash 得到 4999 再mod个size 。因为是数组嘛,直接 a[3] 这样访问,速度是很快的。而不需要像上面那样线性搜索。一个个对比。解决了速度问题。省了搜索。

    4. 同样的道理,存储其它进相应位置。

    5. 但是,hash的时候可能会出现同样 mod 5 =4 的情况。如 xxxyy mod 5 =4. xxx mod 5 也等于 4 。这时候有很多方法。

      以链表形式:

      image-20200921182324699

      如果有多个就多链几个。

      取出来时 ,不是链表的直接返回value 。有多个的 则 先 上面的计算 知道在 4 这个位置 。然后 取出 你好 和 xxx (单向链表是依次取,依次对比)相应的 key 与要寻找的目标key 值 对比 。是否相等。

      因为key是唯一的 所肯定能找到

      总结: 数组大点 。

    是一种树形结构。并在实现优先队列(一种数据结构)时使用。

    • 优先队列:放入值时 任意顺序。取出时,优先取最小的。

    • 堆:子类数字总是大于父类数字。

      image-20200921183415362

    堆:首先添加的数字首先放在末尾。

    image-20200921183504894

    如果 父类的数字较大,则子类与父类互换。重复这个操作。

    所最小值总是在顶部。也就是根结点。

    当顶部的最小值 1 被取出时。需要重新组织堆的结构

    image-20200921183808717

    将结尾的数字移动 到顶部。也就是 6 到顶部。然后同样的,大于的则比较交换(父类6 > 右侧子类5> 左侧子类3 )。这个6 ,直到不再发生交换。此时堆已经有序了。

    现在 3 在根结点了

    缺点:无法执行在树中间 取出数据的操作。因为会破坏结构。

    主要用于 优先队列 和戴克斯特拉算法。

    优先队列就是取出堆数据后,重新排列堆,以便下次取出的还是最小的。

    二叉查找树

    有编号的点称为结点。

    二叉查找树有两个属性:

    • 所有节点都比左子树中的节点大 。 如15 比 9 3 12 8 都大
    • 所有节点都比右子树中的节点小。如15 小于23 17 28

    image-20200921184904817

    由于这两个属性,下列结论成立:

    • 二叉查找树 最小节点位于最顶端节点的最左边的子树行的末尾 。

      也就是3 是最小的

    • 同样的道理。二叉查找树最大节点 位于最顶端节点的最右边的子树行的末尾。

      也就是 28 是最大的。

    下面是添加节点的过程:

    1. 添加 数字 1 进去。

    2. 从最顶端节点开始开始。由于 1<15 向左走。

      1<9 继续向左走

      1<3 继续向左走,但因为没有节点在前方,所以我们添加为一个新的节点。

    3. 接下来添加一个4 。同理。走到 4 > 3 时,向右走,4 < 8 4 作为新结点 左则

    image-20200921190136560

    下面是删除节点过程:

    1. 删除目标28 。当节点 没有子结点的时候,直接删除就行。
    2. 删除目标8 。只有一个子结点时,直接删除,子结点填补上去。4补上去
    3. 删除目标9. 子结点有两个的时候,从删除节点的左子树找到最大 的节点。4补上去

    image-20200921190620176

    怎么找最大值由属性结论给出。保留完整性。节点移动了也有它自己的子节点,那么递归 地重复相同的过程。

    下面是搜索节点过程:

    1. 搜索12

    2. 从最顶部开始,12<15 向左走。大于则行右走。

    3. 12>4 向右走,没有路走,找到了12

      可以看到二叉查找 树可以实现 高效搜索

    但是,如果树形接近一条垂直的线,则效率就非常差了。变成了线性搜索

    image-20200921191452062


    另一方面,如果一直保持良好平衡的二叉树称为==“自平衡二叉查找树”== ,能够保持搜索效率。可以参考红黑树

    展开全文
  • 且背包中已装入物品的重量是w,获得的价值是v,计算该结点的目标函数上界的一个简单方法是,将背包中剩余容量全部装入第i+1个物品,并可以将背包装满,于是,得到限界函数:xxx Ø 依上计算从根结点到叶子结点的目标...

    目   录

    回溯算法【0-1背包问题】

    分支界限算法【0-1背包问题】

    作业题(期末考试必考)

    小结


    回溯算法【0-1背包问题】

    分支界限算法【0-1背包问题】

    解决思路:采用优先队列式分支限界

    Ø 确定目标函数上、下界;
    Ø 确定目标函数的计算方法;

    一般情况下,假设当前已对前i个物品进行了某种特定的选择,且背包中已装入物品的重量是w,获得的价值是v,计算该结点的目标函数上界的一个简单方法是,将背包中剩余容量全部装入第i+1个物品,并可以将背包装满,于是,得到限界函数:

    ub = v + (W-w)\times (v_{i+1} / w_{i+1})

    Ø 上计算从根结点到叶子结点的目标函数值直到PT(待处理活结点列表)中取得极大值

    分支限界法求解0/1背包问题算法用伪代码描述如下

    算法7.1:分枝限界法求解0/1背包问题

    输入:n个物品的重量w[n],价值v[n],背包容量W

    输出:背包获得的最大价值和装入背包的物品

    1. 根据限界函数计算目标函数的上界up;采用贪心法得到下界down

    2. 计算根结点的目标函数值并加入待处理结点表PT

    3. 循环直到某个叶子结点的目标函数值在表PT中取极大值

       3.1  i = PT中具有最大值的结点;

       3.2 对结点i的每个孩子结点x执行下列操作:

             3.2.1 如果结点x不满足约束条件,则丢弃该结点;

             3.2.2 否则,估算结点x的目标函数值lb

                      将结点x加入表PT中;

    4. 将叶子结点对应的最优值输出,回溯求得最优解的各个分量。

    作业题(期末考试必考)

    按照优先队列式(LC)分支限界法求解0-1背包问题, 并给出限界函数,并画出该实例的状态空间树

    老师讲解此题的板书:

    博主课堂笔记(仅供参考):

    背包容量下界的计算:

    背包容量W=16。
    ①放入物品1(w1=10;v1=100)和物品4(w4=4;v4=12),背包物品总重量w=14,v=112
    ②放入物品2(w1=  7;v1=63  )和物品4(w4=4;v4=12),背包物品总重量w=11,v= 75
    ③放入物品3(w1=  8;v1=56  )和物品4(w4=4;v4=12),背包物品总重量w=12,v= 68
    下界取最大值,即下界w=112。

    小结

    回溯算法和分支限界算法在最坏情况下需要遍历所有的节点,因此其最坏的算法时间效率也是指数级的。

    展开全文
  • 关于广度优先搜索bfs

    2020-06-24 14:43:33
    算是刚刚了解了广度优先搜索吧,bfs——广度优先搜索,适用于求最短最小问题,用广度优先搜索得到的答案一定是最短最小的。 bfs需要用到的是队列queue,队列queue fifo(先入先出) C++队列Queue类成员函数如下: ...

    算是刚刚了解了广度优先搜索吧,bfs——广度优先搜索,适用于求最短最小问题,用广度优先搜索得到的答案一定是最短最小的。
    bfs需要用到的是队列queue,队列queue fifo表(先入先出)
    C++队列Queue类成员函数如下:

    back()返回最后一个元素

    empty()如果队列空则返回真

    front()返回第一个元素

    pop()删除第一个元素

    push()在末尾加入一个元素

    size()返回队列中元素的个数
    广搜步骤
    从谁开始就把谁存到队列里,从它开始进行以后的步骤,广搜的话会遇到许多分支,每遇到一个分支就要push进队列里,每次处理判断时都要处理最前边的,即front(),处理的同时也要将其pop()掉方便可以一直处理front()。在处理的过程中也要判断找寻是否是结果,进行判断。进行广搜要灵活将struct与queue结合使用。
    蓝桥杯2017初赛 跳蚱蜢
    如图所示: 有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。
    在这里插入图片描述
    我们把这些蚱蜢顺时针编号为 1~8。每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。
    请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃?
    思路:
    状态压缩+bfs,把这个想象成一个字符串“012345678”通过左移1,左移2,右移1,右移2最终变成“087654321”

    #include<iostream>  
    #include<memory.h>
    #include<stack>
    #include<string>
    #include<cmath>
    #include<map>
    #include<algorithm> 
    #include<sstream>
    #include<set>
    #include<queue>
    using namespace std;
    struct node
    {
    	string str;
    	int pos;
    	int step;
    	node(string str, int pos, int step) :str(str), pos(pos), step(step) {}//构造函数
    };
    int N = 9;
    set<string> visited;//2 set来记录搜索过的
    queue<node> q;//1 广度搜索需要 struct和queue函数配合
    void insertq(node x, int i)
    {
    	string s = x.str;
    	swap(s[x.pos], s[(x.pos + i + 9) % 9]);//用滚动数组来记录,对于这种数量不变的队可以这么用
    	if (visited.count(s) == 0)
    	{
    		visited.insert(s);
    		node n(s, (x.pos + i + 9) % 9, x.step + 1);
    		q.push(n);//5 广度搜索
    	}
    }
    
    int main(int argc, char const* argv[])
    {
    	node first("012345678", 0, 0);
    	q.push(first);
    		while (!q.empty())
    		{
    			node temp = q.front();
    			if (temp.str == "087654321")
    			{
    				cout << temp.step;
    				break;//4 出口
    			}
    			else
    			{
    				insertq(temp, 1);
    				insertq(temp, -1);
    				insertq(temp, 2);
    				insertq(temp, -2);
    				q.pop();//3 框架搭建好
    			}
    		}
    	return 0;
    }
    

    关于广度优先搜索我也刚学习,现在懂得不是很多,还需多加练习掌握

    展开全文
  • thinkPHP 全局函数

    2019-10-07 15:30:43
    一些,比如留言,comment class CommentModel extends Model { } M('comment') 的作用就是得到父类Model的对象,且把Model的表名---指向-->comment D函数 D函数也可以实例化Model, 优先实例...
  • 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert...
  • 最佳优先搜索算法 是爬山法的推广但它是对OPEN中所有节点的h(n)进行比较按从小到大的顺序重排OPEN因此是一种全局寻优法 其算法效率类似于深度优先搜索算法但使用了当前节点与目标的估测距离h(n)函数来确定下一步...
  • 分支界限法

    2021-01-02 23:04:35
    为了有效地选择下一个扩展结点,以加速搜索的进程,在每一活结点处,根据限界函数估算目标函数的可能取值(优先值),并根据这些已计算出的函数值,从当前活结点中选择一个最有利的结点(使目标函数取得极值(极大/...
  • 五大算法之分支界限法

    千次阅读 2019-04-25 16:22:08
    基本思想 分支限界法常以广度优先或以...为了有效地选择下一个扩展结点,以加速搜索的进程,在每一活结点处,根据限界函数估算目标函数的可能取值(优先值),并根据这些已计算出的函数值,从当前活结点中选择一...
  • 部分MDS代码流程分析

    2019-07-05 18:42:32
    2.初始化互斥锁Priorty_lock,使rpc线程优先于main函数的thread。 2.5调用init_migrate_ls()函数,将Migrate_ls.state置为1(修改的时候加上互斥锁) 3.得到本地的MDS的id,得到主MDS的id(通过调用conf_get_num()...
  • 邻接矩阵实现 例图 分析 变量 需要一个链表来保存数据-即保存结点 需要一个二维数组来保存每个变...广度优先遍历,深度优先遍历 具体实践 插入,删除结点与边 我认为邻接矩阵的变换是根据结点来变化的。所以我先...
  • 用一个链表保存每一层的节点,然后通过递归得到解,详见gdyx函数 #include #include #include //二叉树的结构体 typedef struct btree{ int data; struct btree *left; struct btree *righ
  • 哈希算法: ...预先设置一个长度M的数组,使用哈希函数F并以数据关键字为自变量,得到唯一返回值(0~M-1)。 下图1 哈希冲突 链地址法,有N个哈希地址就有N个链表,数组Hash存放每个链表头指针 下...
  • 两个资源在一起解压缩后(windows 平台下解压缩)即可得到《从新手到高手——C++全方位学习-(零起点范例教学)-》.pdf 一书。 内容简介: 本书总结了十几本c++图书及教材的优点,摈弃了它们语言拖沓、层次结构混乱...
  • 本着面向对象思想的教诲吧,那这次就优先封装成一个函数,这好办: def func(): pass 函数封装完毕。 然后就是考虑输入参数的格式了,已知输入的参数是两个,且都是字符串,那就有两种可能: 一种是直接将字符串
  • 在考虑任务属性中的任务优先顺序和不可同时执行要求,岸桥属性中的岸桥时间窗、转移时间、初始位置、安全距离和装卸速度等因素下,以单艘船舶的最短岸桥作业时间为目标函数,建立单艘船舶岸桥调度的混合整数线性模型...
  • Branch and Bound Algorithm

    2020-12-23 20:46:07
    Branch and Bound Algorithm分支限界算法主要思想限界函数两种常见的分支限界先进先出(FIFO)最小耗费或最大收益分支限界和回溯 ...按照一定规则,从活结点中取出下一个结点作为新的扩展结点,重复展开,直到得到
  • T有字段a,b,c,都是数字型的 我想select得到的结果排序是这样: 优先按照a降序排列, a相同且a=1的记录,则按照b字段降序 a相同且a=0的记录,按照c字段降序排   其实很容易想到用oracle函数,case,rank...
  • 编译原理 LL(1)文法

    2020-05-05 19:33:28
    为了构建语法树(目的)我们采用了自顶向下的语法分析(方法),深度优先地创建各个节点。这其中我们讨论到非递归向下的语法分析,需要借助预测分析来实现。所谓LL(k)文法,就是构造出向前看k个输入符号的预测分析...
  • 参2:attr读写锁属性,通常使用默认属性,传NULL即可。 pthread_rwlock_destroy函数 销毁一把读写锁 int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); pthread_rwlock_rdlock函数 以读方式请求读写锁。...
  • 6. 假设二维数组M[1..3, 1..3]无论采用行优先还是列优先存储,其基地址相同,那么在两种存储方式下有相同地址的元素有( )个。 A. 3 B. 2 C. 1 D. 0 7. 若Tail(L)非空,Tail(Tail(L))为空,则非空广义L的长度是...
  • 优先引用B中的yongneng字段,如果为空,再通过原函数计算得到yongneng,这里好像要用case when,各位大佬们,应该怎么改?如下是原函数: <p>isnull(  CAST ...
  • 3.4.3 得到时间 60 3.4.4 播放声音 60 第四章 描绘游戏的画笔 61 4.1 初始化DirectDraw 61 4.1.1 简介 61 4.1.2 DirectDraw对象 62 4.1.3 设置控制级和显示模式 63 4.1.4 创建页面 64 4.2 后台缓存和换页 66 4.3 ...
  •  6、科学的方法:用合适的数学模型精确地讨论算法性能,这些模型是在真实环境中得到验证的  7、与网络相结合:配套网站algs4.cs.princeton.edu提供了本书内容的摘要及相关的代码、测试数据、编程练习、教学课件等...
  • C语言编程要点

    2017-09-18 00:10:37
    16.2. 函数参数类型必须在函数参数中或紧跟其后的部分中说明吗? 217 16.3. 程序中必须包含main()的原型吗? 218 16.4. main()应该总是返回一个值吗? 219 第17章 用户界面——屏幕和键盘 219 17.1. 为什么直到程序...
  • 用合适的数学模型精确地讨论算法性能,这些模型是在真实环境中得到验证的  与网络相结合 配套网站algs4.cs.princeton.edu提供了本书内容的摘要及相关的代码、测试数据、编程练习、教学课件等资源 作者简介 · · ...
  • 空指针是由对指针变量赋予0值而得到的。例如: #define NULL 0 int *p=NULL; 对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以...
  • 面试题35:第一个只出现一次的字符:先遍历一遍字符串,用一个hash存放每个出现的字符和字符出现的次数。再遍历一遍字符串,找到hash值等于1的输出即可。 面试题36:数组中的逆序对:这道题可以这么想,我们要找到...

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

优先表得到优先函数