精华内容
下载资源
问答
  • 区间怎么写
    千次阅读
    2021-03-15 14:59:52

    1.区间及写法

    有限区间

    (1) 开区间 例如:{x|a

    (2) 闭区间 例如:{x|a≤x≤b}=[a,b]

    (3) 半开半闭区间 例如:{x|a

    {x|a≤x

    b-a成为区间长度。

    有限区间在数学几何上的意义表现为:一条有限长度的线段。

    注:这里假设a

    二、无限区间 例如:

    { x | a≤x } = [a, +∞ ) { x | a

    { x | x≤a } = ( -∞, a ] { x | x

    { x | x∈ R } = ( -∞, +∞ )

    无限区间在数学几何上的意义表现为:一条直线。

    注:这里假设a

    2.火车票学生优惠区间怎么填

    优惠区间需要填写:学生在学校学习期间,家庭居住地(父亲或母亲之中任何一方居住地)和学校所在地不在同一城市,父母居住地到学校之间为优惠区间,在优惠区间内乘坐火车享受半价票的优惠。

    超出范围的,不享受优惠待遇。 购买学生票要符合以下条件: 1、在国家教育主管部门批准有学历教育资格的普通大、专院校(含民办大学、军事院校),中等专业学校、技工学校和中、小学就读,没有工资收入的学生、研究生。

    2、家庭居住地(父亲或母亲之中任何一方居住地)和学校所在地不在同一城市。 3、大中专学生凭附有加盖院校公章的减价优待凭证、学生火车票优惠卡和经学校注册的学生证,新生凭学校录取通知书,毕业生凭学校书面证明;小学生凭学校书面证明。

    4、在优惠乘车区间之内,且优惠乘车区间限于家庭至院校(实习地点)之间。 5、每年乘车次数限于四次单程。

    当年未使用的次数,不能留至下年使用。 扩展资料: 下列情况不能发售学生票: 1、学校所在地有学生父或母其中一方时; 2、学生因休学、复学、转学、退学时; 3、学生往返于学校与实习地点时; 4、学生证未按时办理学校注册的; 5、学生证优惠乘车区间更改但未加盖学校公章的; 6、没有"学生火车票优惠卡"、"学生火车票优惠卡"不能识别或者与学生证记载不一致的。

    7、学生票按近径路或换乘次数少的列车发售。 参考资料来源:中国铁路12306-网络购买学生票,优惠区间不符合怎么办 参考资料来源:中国铁路12306-哪些学生可以购买学生票?。

    3.学生证乘车区间怎么填

    学生证优惠乘车区间只能填写学校至家庭所在地。若回家途中需经过中转站,火车站售票会售出联程票。

    若家庭所在地没有火车,火车站售票会售出就近地火车站;若学生的父母不在同一地时,由学生选择其中一地填写为家庭地址及学生证优惠乘车区间。

    若学生入校后变换家庭住址或父母在家庭住址以外工作,应及时修改家庭地址及乘车区间。修改学生证优惠乘车区间的,学校在修改处盖章方为有效。

    扩展资料

    购买学生票注意事项:

    学生票要严格按照学生证上的乘车区间发售,不能分段购买。学生火车票优惠区间应按近径路或换乘次数少的列车发售,但在直达列车后换车次数少的远径路也可发售。学生回家或返校,全程旅行中需要乘坐其他交通工具时,在不绕道的原则上,经确认后可分段购买学生票。

    学生火车票优惠时间:春冬季12月1日至3月31日,夏秋季6月1日至9月30日。

    大学生享受学生票优惠,一年有两个时段的限制,其学生证必须办理优惠磁卡,并且每年只享受四次优惠。学生票的发售范围包括了普通硬座票、普通卧铺票和动车组车票。

    按照铁路部门的要求,学生只有购买普通硬座才能享受半价的政策。由于卧铺的价格是包括了硬座和铺位价格在内,所以学生购买卧铺的票价为原有的铺位价格减去硬座票价一半。此外,动车组一等座不享受学生票优惠,二等座位享受公布票价的75%优惠。

    参考资料来源:中国铁路12306-学生

    转载请注明出处文秀网 » 左开右闭区间怎么写

    更多相关内容
  • 单绳抓斗开闭机构是抓斗工作的主要机构,其性能的优劣很大程度会影响抓斗的工作性能和效率。结合工业生产中单绳抓斗开闭机构的实际结构,建立了单绳抓斗开闭机构的运动模型,并利用MATLAB软件进行了运动学和动力学...
  • 配电房开闭所综合监控系统的自动联动功能全部在一体化监控装置实现,在网络断线、服务器故障、软件关闭等情况不影响系统的报警、联动以及记录等功能。
  • 只有点①被检索,所以称为左图分析了 left 时为什么点②不会被检索) 2)中间值取法为 (left + right + 1) / 2 时 若判断条件为 left ,循环继续,则点①也会被检索,所以为左 若判断条件为 left  ...

    目录

     一、前言

    ①什么是二分查找?

    ②二分查找有多优秀?

    ③使用前提

    ④二分查找难吗?

    二、左闭右闭型

    ①代码模板

    ②动图演示

    ③中间位置取法的区别

    ④为什么称其为左闭右闭型

    三、左开右闭,左闭右开型

    ①左闭右开,左开右闭,左闭右开的区分

    四、寻找上下界

    五、巩固练习


     一、前言

    ①什么是二分查找?

            二分查找是在有序表中查找目标元素的算法,其基本思想其实就是“猜数字游戏”——已知某个数k在0~1000之内,如何猜出这个数具体是多大呢?二分查找是这样处理的:

    • k大于500吗?不大于。所以我们将数据范围压缩到0~500之间
    • k大于250吗?大于。所以我们将数据范围压缩到250~500之间
    • k大于375吗?大于。所以我们将数据范围压缩到375~500之间
    • ……

            如此不断的压缩范围数据的范围,最后当只剩下1个数据时答案已经被锁定了(当然如果运气好,那我们选定的“折半值”可能就是k了),可以看到二分查找不断折半缩小待查找的数据范围因此二分查找也被翻译成“折半查找”。

    ②二分查找有多优秀?

            试想如果我们从0~1000一一枚举,那我们最倒霉需要猜1000次,而使用二分的思路最坏也只 要需要10次(怎么算出来的呢?,而,所以10次就可以包含完0~1000的所有情况)。如果数据范围更大些,那效率的差距将会更加的突出。

    假设检查一个元素需要1ms,那我们可以得到以下的表格:

             从这个实际问题中抽象出我们的算法,一一猜数对应着暴力枚举法,它的时间复杂度为,相比之下, 二分查找的时间复杂度为,所以是相当优秀漂亮的算法。

    ③使用前提

            使用二分查找的前提是原数据是一个有序表,即具有单调性。所以说检索也是排序最重要的应用之一。

    ④二分查找难吗?

    二分查找真的很简单吗?其实也并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的:

    Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky...

    这句话可以这样理解:思路很简单,细节是魔鬼。

    所以在这篇文章中向大家介绍二分查找的三种形式,虽然整体形式是极其相似的,但是略微的差别却带来了极大的不同。也相信学习完这篇博客大家可以熟练运用这三种形式的二分查找。


    二、左闭右闭型

    ①代码模板

    左闭右闭型是最典型的模板,也是我们学习的基础,我们依然从猜数字的角度来理解:

    int Binary_search(int*arr, int target, int numsSize)// (1)
    {
    	int left = 0;                                   //(2)
    	int right = numsSize - 1;
    	while(left <= right)     
    	{
    		int mid = (left + right) >> 1;              //(3)
    		if (arr[mid] < target)                
    			left = mid + 1;                         //(4)
    		else if (arr[mid] > target)                 
    			right = mid - 1;
    		else
    			return mid;
    	}
    	return -1;                                      //(5)
    }

    分析:

    • (1)功能:查找有序列表中target是否存在。存在则返回其下标,不存在则返回-1
    • (2)left表示数组下标范围的下界,right表示数组下标范围的上界
    • (3)求出中间值,也就是上面猜数字不断的“折半”值,用它来界定我们的猜测小了还是大了
    • (4)如果arr[mid] < target说明猜小了,所以将下界调整到mid+1
    • (5)循环结束时left > right,说明遍历了整个区间也找不到target,所以返回-1

    看不懂?没关系,用下面的四张动图来帮你理解。

    ②动图演示

    (1)检索 target = 29 是否存在

    更加直观的,我们将数据数据对应到二叉树中

    【如何构建的呢】

     其实就是我们对猜数字游戏的模拟,举个🌰:

    • 开始 left = 0, right = 6, mid  = (left + right) / 2 = 3。由此我们创建出第一个结点41
    • 如果target偏小,则 right = mid - 1 ,mid = (left + right) / 2 = 1.由此我们得到41的左子结点20
    • 如果target偏大,则 left = mid + 1, mid = (left + right)  / 2 = 5.由此我们得到41的右子结点65
    • 同样的道理我们对每个结点都分别求出其左右子结点(如果存在的话),就构造出二叉树了

    【特性】

    • 我们可以发现二叉树中元素自左向右依次递增,即没有改变原来的单调性
    • 不难发现,遍历到二叉树的最后一层时一定有 left = right = mid (三数合一)
    • 若mid的计算发生改成 (left + right + 1) /  2,构造出的二叉树的偏向会不同,读者可自行尝试 

    (2)检索 target = 29 是否存在

     (3)target 找不到的情况(搜索 target = 35)

      【和情况(2)有什么区别呢】

    • 若这个数是target,我们将直接返回它的下标,也即情况 (2)
    • 若这个数不是我们的target,利用三数合一的结论,根据target偏大还是偏小,决定 left = mid + 1或者 right = mid-1 最终使得left > right,循环终止。所以相当于从最后一层向左或向右,“虚伸”出一条不存在的“小腿”。

    (4)更复杂点的情况(采用mid = ( left + right + 1) / 2)

    ③中间位置取法的区别

    以一组数据 [ 1, 2, 3, 4 , 5, 6 ]为🌰:

    • mid = (left + right) / 2, 则获得的mid = (0 + 5) / 2 = 2
    • mid = (left + right + 1) / 2, 则获得的mid = (0 + 5 + 1) / 2 = 3 
    • 两种方法构造出的二叉树偏向不同,若某结点只有一个子结点,方法一得到的子节点一定是往右偏,方法二得到的一定是往左偏(如上图的 6 , 65 都是往左偏的)

    ⭐[小细节]

    如果left + right 存在溢出的问题,则上述中间位置的取法可以改成下面两种形式,保证不会溢出

    • (right - left) >> 1 + left
    • (right - left + 1) >> 1 + left 

    ④为什么称其为左闭右闭型

            因为左闭右闭型检索的区域在  [left , right]  之间。同样的道理,左闭右开检索的区域在 [left, right), 左开右闭的检索区域在 (left, right]


    三、左开右闭,左闭右开型

    ①左闭右开,左开右闭,左闭右开的区分

          核心在于while判断语句中有没有等于号,以及中间值的取法。试想left 与 right不断接近时,最终left 与right紧挨:

    1) 中间值取法为 (left + right) / 2 时

    •  若判断条件为 left <= right, 循环继续,则点②也会被判断,所以为左闭右闭
    •  若判断条件为 left < right, 循环结束, 则点②点不会被判断,只有点①被检索,所以称为左闭右开(上图分析了 left < right 时为什么点②不会被检索)

    2)中间值取法为 (left + right + 1) / 2 时

    •  若判断条件为 left <= right,循环继续,则点①也会被检索,所以为左闭右闭
    • 若判断条件为 left <  right,循环结束,则点①点不会被检索,只有点②被检索,所以称为左开右闭(上图分析了 left < right 时为什么点①不会被检索)

    四、寻找上下界

    二分查找除了可以用来检索一个数是否存在,还可以用来寻找上下界,来看看是怎样实现的吧!

    📃题目①:假设你有n个版本[1, 2, ..., n],已知每个版本都是基于前一版本开发的。由于中间某一版本发生错误,导致之后的所有版本都是错误的。现需要你找出一个发生错误的版本。你可以调用函数bool isBadVersion(version) 来检测当前版本是否是错误版本(是错误版本返回1, 否则返回0)

    int firstBadVersion(int n)
    {
        int left = 1;
        int right = n;
        while(left < right)
        {
            int mid = (right - left) / 2 + left;  
            if(isBadVersion(mid))
                right = mid;
            else
                left = mid + 1;
        }
        return left;
    }

     【分析】

    1)为什么想到二分查找?

            因为二分查找的本质是二段性,只要满足二段性的问题都可以转化为二分查找的问题。

    2)如何理解二段性呢?

            在猜数字游戏中,二段性体现在target左边的元素都比它小,target右边的元素都比它大,所以结合数据的单调性我们可以不断的压缩区间以定位到目标值。而在这个问题中仍然具有二段性,第一个发生错误的版本的之前版本的都是正确的,之后的都是错误的,由此我们仍然可以不断的压缩区间从而得到第一个发生错误的版本。

    3)如何理解左开右闭型的代码?

            若当前mid版本为正确,则 left 可以压缩到mid + 1,若当前版本正确,则将right压缩到mid。可以是mid - 1吗?不妨这样思考,如果当前mid正处于第一个发生错误的版本,right = mid - 1后不是彻底排除了正确答案了吗,永远也找不到了。

             left 和 right 相遇之前,left不可能到达第一个错误版本,只会无限接近;right不可能超过第一个错误版本,只会到达第一个错误版本,所以最后 left 与 right 的关系是这样的。最终, left = mid + 1使得 left 与 right重合也就锁定了第一个错误版本 。

    4)如果上题的中间元素取法为 (left + right + 1) / 2会发生什么?

            会陷入死循环! 因为 mid = right,mid是错误版本,因此执行语句"right = mid",也就意味着left 与 right的区间没有发生压缩。不断重复这个过程就陷入了死循环。

    5)延伸:如果最后的结果是这样的呢?

    此时我们的中间元素取法如果为(left + right ) / 2 ,则同样的我们会陷入死循环。

    6)总结

    • 左闭右开型的适合用来寻找下界,左开右闭型的适合用来寻找上界
    • 根据题意明确好需要寻找上界还是下界后,我们就确定了中间元素的取法。对left,right怎么处理呢?举个例子,左闭右开型的左边是取到到的,那么加1的任务一定要交给它,保证不会陷入死循环。

    📃题目②:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    请必须使用时间复杂度为 O(log n) 的算法

    用左闭右闭型的二分查找也可以实现上下界定位,并且好理解很多。来看看是怎么实现的:

    int searchInsert(int* nums, int numsSize, int target) 
    {
        int left = 0, right = numsSize - 1, ans = numsSize;
        while (left <= right) 
        {
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) 
            {
                ans = mid;
                right = mid - 1;
            } 
            else 
            {
                left = mid + 1;
            }
        }
        return ans;
    }
    

    【分析】与模板唯一的区别在于,找到了继续找。所以上述代码的作用是找到第一个比target小的位置(也就是要插入位置)。当然如果将if里的条件改成 " target >= nums[mid] ",那么相应的作用就变成找到第一个闭target大的位置,当然也可以作为插入位置。

    给大家演示一下: nums[] = {1, 2, 2, 2, 2, 2, 2, 3 ,4 ,5} , target  = 2 的情况吧 

     

     五、巩固练习

    题目地址

    704. 二分查找

    力扣地址

    278. 第一个错误的版本

    力扣地址

    35. 搜索插入位置

    力扣地址

    代码上面都呈现过,一定要都尝试下。

    展开全文
  • 为避免矿区铁路煤炭漏斗车底门在运行途中意外打开,对矿区铁路煤炭漏斗车的底门开闭机构进行研究改进,设计一套限位器锁装置,对底开门开闭机构的限位器进行锁,这样即使底开门假锁,锁铁也可以将上部传动轴牢靠...
  • 首先对于如下的多边形: 1.有效边表填充算法 1.1.有效边表填充算法分为如下几个步骤: 1.1.1.将多边形所有的边分别...1.1.4.将像素区间内的像素填充颜色,至此第一条扫描线处于多边形内的的像素填充完毕。 1.1.5...
    首先对于如下的多边形:
    

    在这里插入图片描述

    1.有效边表填充算法

    1.1.有效边表填充算法分为如下几个步骤:
    1.1.1.将多边形所有的边分别与扫描线1计算交点,得到交点集,与扫描线计算的边没有顺序要求。
    1.1.2.将点集按标x的大小递增排序,得到有序点集。
    1.1.3.将有序点集两两配对,得到对应的像素区间。
    1.1.4.将像素区间内的像素填充颜色,至此第一条扫描线上处于多边形内的的像素填充完毕。
    1.1.5.扫描线标号加1,重复以上步骤,直至到最后一条扫描线。
    如:对于扫描线3(y=3)与多边形所有的边计算交点,得到与P3P4交于点(4.5,3),与P3P2交于点(2.4,3),与P5P6交于点(8.8,3),与P5P4交于点(7,3)。
    圆整处理得到点集(5,3)、(2,3)、(9,3)、(7,3)。
    递增排序得到有序点集(2,3)、(5,3)、(7,3)、(9,3)。
    两两配对得到扫描线3上的填充像素区间[2,5]、[7,9]。
    填充区间内的所有像素。
    得到如图所示的填充效果:
    在这里插入图片描述
    全部填充得到如下效果:
    在这里插入图片描述
    1.2.至此我们发现如下疑问:
    1.2.1.像素填充的多边形面积大于多边形实际面积。
    可能上图不太明显,我们举一个明显一点的例子,如下正方形:
    在这里插入图片描述
    我们填充后的效果为:
    在这里插入图片描述
    而正方形的实际面积是4,在显示器上一个像素为一面积,正方形应该占4个像素点,而实际却占了9个像素点,对于这种问题,有效边表填充算法采用“左闭右开”,“下闭上开”的原则进行像素点的填充,按照此原则,正方形的填充效果如下:
    在这里插入图片描述
    1.2.1.对于点集(1,3)、(1,8)它们分别为扫描线1与P3P2、P3P4、P5P4、P5P6的交点,而在实际计算中它们仍只是两个点,如果处理不当,计算机可能会两两配对得到区间(3,8)而填充到错误的像素区间。
    对于此问题,有效边表填充算法采用分类连接点进行处理。
    有效边表填充算法将多边形的各个连接点分为三类连接点:
    +普通连接点:
    连接点所在的两条边分别处于其所在的扫描线的上方和下方,如P2点。
    +局部最低点:
    连接点所在的两条边都处于其所在的扫描线的上方,如P3、P5点。
    +局部最高点:
    连接点所在的两条边都处于其所在的扫描线的下方,如:P4、P1、P6点。
    在填充开始前,有效边填充算法先对多边形所有的连接点进行分类,判断其在点集中的数量。
    有效边填充算法采用如下原则对多边形的连接点进行处理:
    1.2.2.普通连接点的处理原则
    以P2为例,根据“下闭上开”原则,对于P3P2上的点P2不予填充,P2P1上的点P2需要填充,P2点只填充1次,顾在扫描线7的填充像素点集中P2点的个数记为1,即可以不处理。
    1.2.3.局部最低点的处理原则
    以P3为例,根据“下闭上开”原则,对于P3P2上的点P3需要填充,P3P4上的点P3也需要填充,P3填充2次,扫描线1的填充像素点集中,再添加一个P3点,使其中有两个P3点,在像素点集中将P3点的个数记为2,P5点进行同样的处理,这样当算法进行两两配对时,得到的像素区间为[3,3]、[5,5],如此即可避免出现[3,8]的点集区间,解决此类情况的填充错误。
    1.2.4.局部最高点的处理原则
    以P1点为例,根据“下闭上开”原则,对于P2P1上的P1点不予填充,P0P1上的P1点也不予填充,P1填充0次,扫描线12的像素填充点集中P1点的个数记为0,即从点集中删除P1点,这样的处理符合多边形整体的“下闭上开”原则。
    至此,多边形的有效边表填充算法的填充原理已经完成。
    但是,我们在填充多边形之前还需要进行一项很重要的工作——根据多边形计算其有效边表,首先我们要了解什么是有效边。
    +有效边:多边形与当前扫描线相交的边称为有效边,有效边的引入可以有效的避免扫描边与多边形的所有的边进行交点计算,提高算法的效率。
    +有效边表:有效边按与扫描线交点x坐标递增顺序存放的链表。
    +有效边表节点结构:
    在这里插入图片描述
    示例:扫描线1的有效边表如下:
    在这里插入图片描述
    +桶表:有效边表按扫描线自增顺序存放的表,可以是链表,也可以是顺序表。
    +桶表的结构:
    如:多边形P0-P6的桶表为:
    在这里插入图片描述
    有效边表可以有效的减少计算量,提升多边形的填充效率,如所有的扫描线中,计算机只需要计算扫描线1、扫描线7和扫描线8,且扫描线1只需和边P2P3、P3P4、P4P5、P5P6计算交点,而无需与所有边计算交点,有效边填充算法是目前最有效的多边形填充算法之一。
    至此,多边形的有效边填充算法全部完成。

    2.边缘填充算法

    2.1.算法原理:
    先计算多边形每条边与扫描线的交点,然后将交点右侧的所有像素颜色全部取补色。
    2.2.补色的定义:
    对于黑白图像,白色的补色为黑色,黑色补色为白色,对于彩色图像,前景色取补就是将前景色置为背景色,背景色取补就是将背景声置为前景色。
    示例:
    在这里插入图片描述
    边缘填充算法的填充效率受到右侧填充像素的数量影响,当多边形靠近屏幕左侧时,计算机将填充大量无用像素,大大降低的算法的性能,浪费了系统资源。
    于是有人提出这样的改进:首先在进行多边形填充之前,先扫描一遍多边形,得出多边形的包围盒,并在适当的位置加入一条栅栏。
    包围盒:包围多边形的最小矩形。
    2.3.加入包围盒和栅栏的边缘填充算法原理:
    每次填充前先判断当前边在栅栏的左侧还是右侧,若在左侧,则取补边以右,栅栏以左的像素;若在右侧,则取补边以右,栅栏以左的像素。
    示例:
    在这里插入图片描述
    可以看出,加入包围盒和栅栏的边缘填充算法极大的减少了需要填充像素的数量,对填充效率的提升是显著的。
    观察边缘填充算法的两幅图,我们是可以察觉到的,边缘填充算法,对多边形的顶点与边的填充不甚理想,边缘填充算法没有给定具体填充时,直线上的点是否包含在填充范围内,笔者试过两种情况的对比------填充时包含直线上的点和填充时不包含直线上的点,得出的结果,多边形的顶点与边的填充都不理想,但是,填充时包含直线上的点的填充方法的最总结果,使多边形在整体上满足“左闭右开”,“下闭上开”原则,顾才用此方法作图。然而,边缘填充算法的填充原理是没有考虑边界的,即多边形的所有像素都填充为一个颜色,无论多边形内部还是多边形的边和顶点,在实际填充效果中,多边形所有像素都填充为一个颜色的填充方式,顶点和边对整体的效果不大,即可以忽略,所以边缘填充算法依旧是效率极高的填充算法之一。

    3.种子填充算法

    3.1.种子填充算法是区域填充算法中的一种,种子填充算法分为:四邻接点种子填充算法和八邻接点种子填充算法。
    在此之前,我们需要了解一些概念:
    3.1.1.四邻接点:
    任易一个种子像素,其左右上下这四个像素成为这个种子像素的四邻接点。
    在这里插入图片描述
    3.1.2.八邻接点:
    任易一个种子像素,其左右上下及左上、右下、右上、左上这八个像素成为这个种子像素的八邻接点。
    在这里插入图片描述
    3.1.3.四连通域:
    多边形中能被四邻接点遍历填充的区域。
    3.1.4.八连通域:
    多边形中能被八邻接点遍历填充的区域。
    在这里插入图片描述
    3.1.5.四连通边界:
    在这里插入图片描述
    3.1.6.八连通边界:
    在这里插入图片描述
    3.2.适用场景:
    区域填充算法适用于多边形的边界与内部使用不同的填充色的场景。
    3.3.多边形边界的颜色:
    边界的颜色由绘制多边形时的画笔确定。
    3.4.多边形内部的颜色填充步骤
    3.4.1.在多边形内部任易选择一个像素作为种子像素。
    3.4.2.将种子像素入栈。
    3.4.3.如果栈不为空,则将栈顶元素出栈。
    3.4.4.按填充色绘制出栈像素。
    3.4.5.按四邻接点(左、上、右、下)(或八邻接点(左、左上、上、右上、右、右下、下、左下))顺序搜索与出栈像素相邻的4(或8)个像素,若该像素的颜色不是填充色并且也不是边界色,则把该像素入栈,否则丢弃该像素。
    不难想象,当多边形的面积极大时,入栈的像素像素将是巨量,有的像素可能即是一个像素的邻接点又是另一个像素的邻接点,以致部分像素入栈多次,此情况下填充过程将大量占用栈存储空间,甚至过量占用空间,致使栈空间不足,导致其他程序无空间可用,如此既不能完成填充,又会造成空间溢出,甚至系统崩溃,所以种子填充算法的缺点极为严重。
    3.5.改进------扫描种子填充算法
    3.5.1.在多边形内部选择一个像素作为种子像素。
    3.5.2.将种子像素入栈。
    3.5.3.若栈不为空,则将栈顶元素出栈
    3.5.4.沿出栈像素所在扫描线,对出栈像素左右像素依次填充,直至遇到边界像素为止。
    3.5.5.记录该区间的范围,将最左端的像素记为Xl,将最右端的像素记为Xr。
    3.5.6.检查与当前扫描线相邻的上下两条扫描线中在区间[Xl,Xr]里的有关像素是否全为边界像素或以填充像素,若存在非边界且未填充的像素,则把区间最右端像素取作种子像素入栈。
    扫描种子填充像素每次只将区间最右端的像素入栈,极大的减少了入栈像素,不仅减少了栈空间的占用,还有效的提高了填充效率和填充速度。

    展开全文
  • 什么是开闭原则?如何实现开闭原则

    千次阅读 2021-03-07 04:15:57
    04-13 06:30:01阅读( 137 )开闭原则的解释就是:软件实体应当对扩展开放,对修改关闭,也就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的基础,...

    2015-04-13 06:30:01

    阅读( 137 )

    开闭原则的解释就是:软件实体应当对扩展开放,对修改关闭,也就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。

    开闭原则是说我们应该努力设计不需要修改的模块。在扩展系统的行为时,我们只需要添加新的代码,而不需要修改已有的代码。一般可以通过添加新的子类和重写父类的方法来实现。

    满足开闭原则的模块需要符合如面两个标准:

    对扩展开放 ——- 模块的行为可以被扩展从而满足新的需求。

    对修改关闭 ——- 不需要修改模块的源代码。(或者尽量使修改最小化)

    怎样实现开闭原则

    抽象

    多态

    继承

    接口

    要想使一个软件系统的所有模块都满足开闭原则是不太现实的,不过我们应该努力使大部分模块满足开闭原则。开闭原则是面向对象设计的核心,满足该原则可以达到最大限度的复用和可维护性。

    实例

    考虑下面某个类的方法:

    Java代码

    public double totalPrice(Part[] parts) {

    double total = 0.0;

    for (int i=0; i

    total += parts.getPrice();

    }

    return total;

    }

    上面函数的功能是计算给定的零件数组中所有零件价格的总和,如果Part是一个基类或者接口,那我们就可以利用多态的特性,当有新的零件被添加进来时不需要修改该函数的代码。这样它就可以满足开闭原则。

    但是如果我们的会计部门规定当计算主板和内存的价格时,需要添加一些额外的费用,请看下面的代码:

    Java代码

    public double totalPrice(Part[] parts) {

    double total = 0.0;

    for (int i=0; i

    if (parts instanceof Motherboard)

    total += (1.45 * parts.getPrice());

    else if (parts instanceof Memory)

    total += (1.27 * parts.getPrice());

    else

    total += parts.getPrice();

    }

    return total;

    }

    现在它还符合开闭原则吗?不!每次会计部门发布一个新的价格政策时,我们都需要修改totalPrice()方法!它对修改不是关闭的,显然,价格政策的改变意味着我们必须修改某处的代码,那么我们应该怎么做呢?为了使用我们第一个版本的totalPrice()方法,我们需要把Part的 getPrice()方法的价格政策包含进来。

    下面是Part和ConcretePrat类:

    Java代码

    // Class Part is the superclass for all parts.

    public class Part {

    private double price;

    public Part(double price) (this.price = price;}

    public void setPrice(double price) {this.price = price;}

    public double getPrice() {return price;}

    }

    // Class ConcretePart implements a part for sale.

    // Pricing policy explicit here!

    public class ConcretePart extends Part {

    public double getPrice() {

    // return (1.45 * price); //Premium

    return (0.90 * price); //Labor Day Sale

    }

    }

    但是,现在如果价格政策改变,我们必须修改Part的子类,一个更好的方法是建立一个PricePolicy类,它可以为我们提供不同的价格政策:

    Java代码

    /**

    * Class PricePolicy implements a given price policy.

    */

    public class PricePolicy {

    private double factor;

    public PricePolicy (double factor) {

    this.factor = factor;

    }

    public double getPrice(double price) {return price * factor;}

    }

    使用这种方法,我们可以在运行时动态的设置Part对象所引用的PricePoilcy对象,在实际的程序中,零件的价格和相关的PricePolicy可以从数据库中获取。

    总结

    像许多其他原则一样,开闭原则只是面向对象设计的一个原则,实现一个灵活的设计需要额外的时间和努力,引入新的抽象层会增加代码的复杂性。因此,该原则适用于那些需求会经常发生变化的系统。有许多设计模式可以帮助我们扩展功能而不需要修改代码。例如,装饰模式等。

    分享给朋友:

    亲~ 如果您有更好的答案 可在评论区发表您独到的见解。

    您想查看更多的信息:

    面试题

    展开全文
  • 为有效提高MTRNN查询的效率, 在概述MTRNN基础采用几何方法开发了基于R-tree的区域和区域修剪方法并进一步提出了高效的过滤算法。过滤算法通过构造修剪区域和修剪区域来修剪查询空间, 对大数据的MTRNN...
  • 如何理解左

    千次阅读 2020-12-17 11:20:27
    开闭区间是一个数学概念,区间使用符号小括号()表示,区间使用符号中括号[]表示,区间包含了两个端点,而区间则不包含两个端点 示例: 一共四种情况: (a,b):区间范围内,包含a和b [a,b]:区间范围内,不...
  • c++开闭原则

    千次阅读 2017-10-17 10:25:38
    本文章主要讲价了C++中如何实现开闭原则,以及开闭原则的好处,用法等。
  • 今天给一个学生辅导归并排序,他问了上面这个问题. 下面是我的一点个人体会,对比一下左和左区间的特点 ...2、已知长度L的情况,右的调用形式为f(array,start,start+L) ,右的调用形式为f(arra...
  • 数字图像处理算法之形态学运算先操作对指纹去噪Delphi 源码 基本思想是冈萨雷斯的书的。处理的源图像也是电子书的截图。
  • 20、运算与运算

    千次阅读 2021-03-16 17:58:04
    一、运算含义 先进行腐蚀再进行膨胀就叫做运算。运算 (image)= 膨胀 (腐蚀 (image)) 图像被腐蚀后,去除了噪声,但会压缩图像;对腐蚀过的图像进行膨胀处理,可以去除噪声并保持原有形状。 二、morphologyEx()...
  • range的左原则

    千次阅读 2018-09-25 16:18:00
    例: range(1,14) # 生成1到13的随机数 python中的range(start,end)生成的随机数的范围是start~end-1。 即就是生成随机数的范围为[start,end)。这就是左原则。...
  • 为什么java中很多范围取值都是左呢? 今天在写随机数的时候,注意到左,突然就想java中很多范围都是取左(二分查找,分治,for循环,数组下标,list等等)这仅仅是程序员的习惯吗? 我们拿字符串...
  • 开闭原则

    千次阅读 2018-10-24 09:19:53
    抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质相同的具体概念的抽象。比如,在一个图形编辑软件的分析设计过程中,就会发现问题领域存在着圆、三角形这样一些具体...
  • halcon 运算与运算

    千次阅读 2021-01-26 17:17:08
    策略1:分割出黑色部分,然后通过运算去掉毛刺,再通过原黑色部分区域减去运算之后的区域,得到毛刺部分的区域。 1 read_image (Tu, 'C:/Users/xiahui/Desktop/tu.jpg') 2 binary_threshold (Tu, Region, 'max...
  • 运算和运算是形态学中最为重要的两个组合运算,这两个运算是不同形状不同大小的核对图像变换的影响比较大,运算有助于断开一些图像间的细小连接或背景的一些图像噪点、去除图像边缘的凸起,运算可以用于...
  • 浅谈开闭原则

    千次阅读 2020-09-03 19:02:02
    开闭原则是java 6大基本原则之一,而6大原则在软件开发中属于内功心法的存在,需要长期进行修炼,才能有所成就。今天就单独谈谈“开闭原则”,它的定义是:对扩展开放、对修改关闭。简单、直白的定义,确很难理解它...
  • C++左区间的理解

    千次阅读 2018-10-11 09:07:37
    C++的区间是左的,关于这样做的优势,做了一个笔记整理,也处理之前一直比较模糊的区间二分的问题。 左的区间第一个优势是,当需要取中间元素的时候,mid=begin+end/2的定位问题。如果区间元素的个数...
  • 【OpenCV】腐蚀、膨胀及其开闭运算

    千次阅读 2019-02-03 20:30:32
    简单地介绍了腐蚀、膨胀及其开闭运算的基本概念,使用一个典型的例子示范了该处理方法的应用场合。(附代码)
  • 图像运算和运算

    千次阅读 2020-06-12 09:35:53
    图像运算与运算与膨胀和腐蚀运算有关,由膨胀和腐蚀两个运算的复合与集合操作(并、交、补等)组合成的运算构成。运算与运算依据腐蚀和膨胀演变而来。 1)运算:先对图像腐蚀后膨胀。 A○S= (AΘS)⊕ ...
  • Halcon 运算

    千次阅读 2019-11-19 14:16:11
    运算和运行 在膨胀和腐蚀两个基本运算的基础,可以构造出形态学运算族,它由上述两个运算的符合和集合操作(并、交、补等)组合成的所有运算构成。其中两个最为重要的组合运算是形态学运算和运算。 运算...
  • 面向对象设计原则之开闭原则

    千次阅读 2019-03-04 16:50:55
    如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行扩展,而且在扩展时无需修改现有代码,使得软件系统在拥有适应性和灵活性的同时具有较好的稳定性和延续性。 二、开闭原则分析 1.定义 开闭原则(Open...
  • 1.区间 满足 a 的实数 x 的集合, ————3 < x < 8 的实数x的集合 表示为 ( a,b ),叫做区间;—————( 3,8 ),不包括头,不包括尾 2.区间 满足 a ≤ x ≤ b 的实数 x 的集合,————3 ≤ x ≤ b...
  • python 区间 区间 理解

    千次阅读 2020-12-16 16:04:46
    对于区间,本身已经不包含两端点值,所以根本满足不了连续...在已经证得该函数在该区间内连续,之后在两端点处,左极限等于左端点的函数值,右极限等于右端点的函数值,那么就可以说明函数在该区间连续。 举例
  • 浅析编程语言的区间为何常是左
  • 解决哈希冲突两种常见的方法是:散列和散列 1.散列的实现 散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置, 那么可以把key存放到冲突位置中的“一个” ...
  • 其基本的运算包括:腐蚀和膨胀、运算和运算、图像顶帽运算和图像底帽运算、骨架抽取、形态学梯度、Top-hat变换等。万字长文整理,希望对您有所帮助。该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解...
  • 聊聊左区间

    万次阅读 2017-06-02 21:06:05
    《编程珠玑》里说过:大约10%的专业程序员,才能够正确地写出二分查找。...左区间在STL数据结构的构造参数,一些api的返回值范围等场景,也都广泛应用。仔细思考,还是有些规律在里面的。先来看三个使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 142,863
精华内容 57,145
关键字:

下闭上开