普林斯顿算法课part2第二周作业_seamcarving

author author     2022-08-21     598

关键词:

作业地址:http://coursera.cs.princeton.edu/algs4/assignments/seamCarving.html

作业难点:

1、如何获取图形的RGB属性?

  需要研习下Picture、Color类等,使用getRGB()、getRed()、getGreen()、getBlue()等函数;

2、如何计算从顶端到底部的最低energy曲线(即最短路径)?

  使用课上讲的Dijkstra算法求解即可;

3、是否将findHorizontalSeam和findVerticalSeam的方法合并?

  如果要合并,关键的问题在于将energy矩阵转置;

容易扣分点:

1、怎么确保对象内存使用在要求的内存范围内?

  不同于第一份的作业,第二部分的作业的数据结构没有显示给出。本次作业中,为了降低对象的内存使用情况,要尽量避免使用全局性的私有变量,因此部分函数的参数会变得很长;

2、removeHorizontalSeam和removeVerticalSeam函数执行后对象未及时更新。

  要确保在两个函数的最后进行图像更新;

部分代码:

1、数据结构:

    private int[][] colorRGB;
    private int width;
    private int height;         
    private Picture picture;
    private static final double MAX_ENERGY = 1000.0;

2、求解最短路径:

技术分享
   private void DijkstraSP(boolean isVertical, double[][] energy, double[] distTo, int[] edgeTo) {
       int V = width * height;  
       for (int v = 0; v < V; v++) {
           distTo[v] = Double.POSITIVE_INFINITY;
           edgeTo[v] = 0;
       }
       int initLen = width;
       if (!isVertical) initLen = height;
       IndexMinPQ<Double> pq = new IndexMinPQ<Double>(V);       
       for (int v = 0; v < initLen; v++) {
           distTo[v] = MAX_ENERGY;
           pq.insert(v, distTo[v]);
       }
       boolean notFinStat = true;
       while (!pq.isEmpty() && notFinStat) { 
           relax(pq.delMin(), isVertical, energy, distTo, edgeTo, pq);           
           for (int i = V - 1; i > V - initLen; i--) 
               if (distTo[i] != Double.POSITIVE_INFINITY) {
                   notFinStat = false;
                   break;
               }
       }
   }   
   private void relax(int v, boolean isVertical, double[][] energy, double[] distTo, int[] edgeTo, IndexMinPQ<Double> pq) {
       int x, y, w;
       double weight;
       int seamWidth = width, seamHeight = height;  
       if (!isVertical) {
           seamWidth = height; 
           seamHeight = width;
       }
       x = v % seamWidth; 
       y = v / seamWidth;
       if (x == 0 || x == seamWidth -1 || y == seamHeight - 1) 
           return;    
       for (int delta = -1; delta < 2; delta++) {     
           w = (y+1) * seamWidth + (x + delta);
           weight = energy[x + delta][y + 1];      
           if (distTo[w] > distTo[v] + weight) {
               distTo[w] = distTo[v] + weight;
               edgeTo[w] = v;
               if(y + 1 == seamHeight - 1) return;
               if (pq.contains(w)) pq.changeKey(w, distTo[w]);
               else pq.insert(w, distTo[w]);
           }
       }    
   }
View Code

3、求解顶端到底部的路径:

技术分享
   private int[] findSeam(boolean isVertical, double[] distTo, int[] edgeTo) {
       int minIndex = 0;       
       double minDist = Double.POSITIVE_INFINITY;
       int seamWidth = width, seamHeight = height;
       if (!isVertical) {     
           seamWidth = height;
           seamHeight = width;
       }
       int[] seamPath = new int [seamHeight];
       for (int i = 0; i < seamWidth; i++)      
           if (distTo[(seamHeight - 1) * seamWidth + i] < minDist) {
           minIndex = (seamHeight - 1) * seamWidth + i;
           minDist = distTo[(seamHeight -1) * seamWidth + i];
       }    
       for (int i = seamHeight - 1; i > 0 ; i--) {
           seamPath[i] = minIndex % seamWidth;
           minIndex = edgeTo[minIndex];
       }
       if (seamPath.length > 1) seamPath[0] = seamPath[1];
       return seamPath;
   }   
View Code

4、energy转置:

技术分享
   private double[][] energyTranspose(int W, int H, boolean isTranspose) {
       double[][] result = new double[W][H];
       for (int y = 0; y < H; y++)
           for (int x = 0; x < W; x++) {
           if (isTranspose) result[x][y] = energy(y, x);
           else result[x][y] = energy(x, y);
       }   
       return result;        
   }   
View Code

5、removeVerticalSeam():

技术分享
   public void removeVerticalSeam(int[] seam) {
       if (seam.length != height || width <= 1) 
           throw new java.lang.IllegalArgumentException();
       checkSeam(seam, width);
       int[][] copy = new int[width-1][height];
       for (int y = 0; y < height; y++) {
           for (int x = 0; x < width; x++) {
               if (x < seam[y]) copy[x][y] = colorRGB[x][y];
               else if (x > seam[y]) copy[x-1][y] = colorRGB[x][y];
           }
       }
       width--;
       colorRGB = copy;  
       picture();
   } 
View Code

  

第二周作业__增删改查

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd 查看详情

第二周的作业第二题_张东明

描述:每人自己建立一个HelloWorld项目,练习使用git的add/commit/push/pull/fetch/clone等基本命令。比较项目的新旧版本的差别。1、 创建一个Git仓库——在现有目录初始化库  创建一个helloWorld文件夹,在该文件夹右键直接... 查看详情

第二周作业第三题_张东明

描述:完成小组的“四则运算”项目的需求文档(使用Markdown写文档),尝试同组成员在各自PC上修改同一文档后,如何使用Git命令完成GitHub上的文档的更新,而不产生冲突。并验证GitHub上的文档确实是最新的文档。1、将... 查看详情

普林斯顿公开课算法1-2:观察

这章通过一个简单的样例。具体说明算法分析的步骤。算法问题给定N个不同的整数,从中随意取出三个整数。请问有几种情况,使得取出的3个整数之和为0?解法能够使用暴力算法,代码例如以下:123456789for(int i=0;i<N;i++){&... 查看详情

普林斯顿公开课算法2-2:选择排序

选择排序就是对数组进行扫描,每次扫描找出最小的元素,并将其提到元素的前面。动图http://www.sorting-algorithms.com/animation/20/random-initial-order/selection-sort.gif代码public class Selection{    public stat 查看详情

普林斯顿公开课算法2-1:排序概述

目标对全部类型的数据进行排序。问题排序函数怎样知道比較的是哪种类型的数据呢?回调函数这时候就须要引入回调函数的概念了。回调函数就是将可运行的代码作为參数进行传递。实现回调的方法在Java中能够通过接口来实... 查看详情

第二周作业三效能测试

...能有很粗浅的认识。认为多重循环层数多了性能低,递归算法性能低。今天我实际用了vs2013的工具看了一下程序的性能。本来我只有devc++这种轻量级ide使用,性能分析这个功能虽然有好像不太好用,为了完成作业,用格式化硬盘... 查看详情

第二周作业

title:第二周作业tags:nullcategories:nulldate:2022-08-0409:03:471.权限管理及文本编辑工具1.1.默认权限管理1.1.1.umask值用来保留在创建文件或目录的权限新建文件和目录默认权限新建文件默认权限:666-u 查看详情

程序语言与编程实践5-;java实操2|第二周作业及思路讲解|基础知识强化考察(代码片段)

Java的第二周作业的思考总结,涉及的只是有static代码块的输出次序,面向对象的编程实战,字符串的拼接等java基本的关键的内容。是这样的,Java这门课没有给线上实验评测平台(我还专门上平台上看了看),第一周作业出得挺... 查看详情

第二周作业

 一.作业。   对比我之前写的词频统计和linux命令词频统计“catlog.txt|tr‘‘‘ ‘|trA-Za-z|sort|uniq-c|sort|head”。(首先说明我写的词频统计是基于javaweb的,用户上传文件进行词频统计。)   1.系统依... 查看详情

第二周第一次课

2.6相对和绝对路径任何一个文件都是从根开始的路径,比如之前我们配置的网卡的路径[[email protected]~]#ls/etc/sysconfig/network-scripts/ifcfg-ens33/etc/sysconfig/network-scripts/ifcfg-ens33【这个就是网卡的配置路径】还有[[email protected]~]#ls/... 查看详情

第二周作业

第二周作业一.学习内容总结:1.关于提问的智慧:http://www.dianbo.org/9238/stone/tiwendezhihui.htm这是一篇关于提问的智慧的文章,接下来谈一谈收获。首先,值得一提的便是提问之前的旅程,在提问之前我们需要的是通过查阅书籍自... 查看详情

第二周作业

我的Git账号:AI1452349541 ,下面是作业的截图    ***要求一:用自己的话来描述自己的阅读收获,同时举例说如何进行提问***    <1> 提问之前          1 查看详情

20165306课下作业(第二周)

一、教材代码完成情况测试代码链接此代码作用是求和(1~5306)。二、带包的代码编译运行测试代码链接三、课后习题p161.Person.java2.两个,Person.class和Xiti.class代码链接 查看详情

第二周3次课笔记

二周第三次课(1月31日)2.14文件和目录权限chmod2.15更改所有者和所属组chown2.16umask2.17隐藏权限lsattr_chattr2.14文件目录权限第一列第1位是文件类型,文件类型后面的9位分3个部分,前3位是所有者权限,中间3位是所属组权限,最后3... 查看详情

第二周作业

先测试车辆的进入与进出,定义升起和落下的杆,通过杆的状态不同亮的灯也不一样,在判断车辆有无出入。代码主函数:#include"./head.h"#include<iostream>usingnamespacestd;intmain(){   GurdSystemgs;      &... 查看详情

团队作业2,第二周

 小组:OJBK小组成员:陈敬轩201421122059,张洪滨201421122060,黄兴201421122067,林国梽201421122068,唐壶海201421122069需求分析需求描述: 为提高中小学生的计算能力与速度,以及方便家长或教师加强对孩子的培养。基于WEB开发的四... 查看详情

courseramachinelearning第二周编程作业linearregression

必做:[*]warmUpExercise.m-SimpleexamplefunctioninOctave/MATLAB[*]plotData.m-Functiontodisplaythedataset[*]computeCost.m-Functiontocomputethecostoflinearregression[*]gradientDescent.m-Functiontorungradien 查看详情