[图像处理] 图片压缩(Java)

1 序言

调第三方平台,太贵。还得自己有,才是真。

2 Maven 依赖

<!--图片压缩-->
<!--http://repo1.maven.org/maven2/net/coobird/thumbnailator/-->
<!--Java使用Thumbnails实现图片指定大小压缩-CSDN-http://blog.csdn.net/qq_38530648/article/details/119333058-->
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>

3 示例代码

//1.先转换成jpg
Thumbnails.of(srcPath) // File / URL / InputStream / BufferedImage /
	.scale(scale)
	.outputQuality(quality)
	.toFile(desPath);

import jdk.management.resource.ResourceType;
import net.coobird.thumbnailator.Thumbnails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author johnny-zen
 * @version v1.0
 * @description ...
 * @refrence-doc
 *  [1] Java使用Thumbnails实现图片指定大小压缩 - CSDN - http://blog.csdn.net/qq_38530648/article/details/119333058
 * @gpt-promt
 */
public class ThumbnailUtil {
    private final static Logger logger = LoggerFactory.getLogger(ThumbnailUtil.class);

    /**
     * 根据指定大小和指定经度压缩图片
     *
     * @param srcPath     源图片地址
     * @param desPath     目标图片地址
     * @param desFileSize 指定图片大小,单位kb
     * @param scale    精度,递归压缩的比率,建议小于0.9
     * @return
     */
    public static String compressPictureForScale(String srcPath, String desPath, long desFileSize, double scale,double quality, int compressCount) {
        if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(desPath)) {
            return null;
        }
        if (!new File(srcPath).exists()) {
            return null;
        }
        try {
            File srcFile = new File(srcPath);
            long srcFileSize = srcFile.length();
            logger.info(String.format("source file : %s, size : %d kb", srcPath, srcFileSize / 1024 ));
            //1.先转换成jpg
            Thumbnails.of(srcPath) // File / URL / InputStream / BufferedImage /
                .scale(scale)
                .outputQuality(quality)
                .toFile(desPath);
            //递归压缩,直到目标文件大小小于desFileSize
            //compressPicCycle(desPath, desFileSize, accuracy, compressCount);

            File desFile = new File(desPath);
            logger.info(String.format("Success to complete file compression ! | destination file : %s, size : %d kb", desPath, (int) (desFile.length() / 1024) ));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return desPath;
    }

    private static void compressPicCycle(String desPath, long desFileSize, double accuracy, int compressCount) throws IOException {
        File srcFileJPG = new File(desPath);
        long srcFileSizeJPG = srcFileJPG.length();
        //2.判断大小,如果小于50kb,不用压缩,如果大于等于50kb,需要压缩
        if (srcFileSizeJPG <= desFileSize * 1024) {
            logger.debug(String.format("File size is is less than %d kb, no compression optimization required.", desFileSize));
            return;
        } else {
            logger.info(String.format("%d | source file : %s, size : %d kb", compressCount, desPath, desFileSize / 1024 ));
        }
        //计算宽高
        BufferedImage bim = ImageIO.read(srcFileJPG);
        int srcWidth = bim.getWidth();
        int srcHeight = bim.getHeight();
        int destWidth = new BigDecimal(srcWidth).multiply(new BigDecimal(accuracy)).intValue();
        int destHeight = new BigDecimal(srcHeight).multiply(new BigDecimal(accuracy)).intValue();

        Thumbnails.of(desPath).size(destWidth,destHeight).outputQuality(accuracy).toFile(desPath);
//        Thumbnails.of(targetFile)
//                .scale(0.1f)//指定图片大小    0-1f  1f是原图
//                .outputQuality(1f)//图片质量  0-1f  1f是原图
//                .toFile(newFile);

        File file = new File(desPath);
        long desPathFileSize = file.length();

        compressPicCycle(desPath, desPathFileSize,accuracy, compressCount + 1);

    }

    private Map<String, Object> saveFileAndThumbnail(MultipartFile file) throws BusinessException {
        String fileUploadPath = "C:\\Users\\408675\\Desktop\\";
        // 判断文件是否为空
        if (!file.isEmpty()) {
            String root = fileUploadPath;//上传路径
            String picturePath = fileUploadPath;//保存路径
            String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            String newName = String.valueOf((new Date()).getTime()) + ext;
            File filedict = new File(root+picturePath);
            if(!filedict.exists()){
                filedict.mkdirs();
            }
            File targetFile=new File(root+picturePath+File.separator+newName);
            File newFile=new File(root+picturePath+File.separator+"s"+newName);
            try {

                file.transferTo(targetFile);
                Thumbnails.of(targetFile)
                        .scale(0.1f)//指定图片大小    0-1f  1f是原图
                        .outputQuality(1f)//图片质量  0-1f  1f是原图
                        .toFile(newFile);
                BufferedImage bimg = ImageIO.read(targetFile);
                int width = bimg.getWidth();
                int height = bimg.getHeight();
                BufferedImage thumbnail = ImageIO.read(newFile);
                int thumbnailWidth = thumbnail.getWidth();
                int thumbnailHeight = thumbnail.getHeight();
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("pictureHeight",height);
                map.put("pictureWidth",width);
                map.put("picturePath",picturePath+"/"+newName);
                map.put("thumbnailHeight",thumbnailHeight);
                map.put("thumbnailWidth",thumbnailWidth);
                map.put("thumbnailPath",picturePath+"/s"+newName);
                return map;
            } catch (IllegalStateException e) {
                e.printStackTrace();
                throw new BusinessException("Fail to upload file! ");
            } catch (IOException e) {
                e.printStackTrace();
                throw new BusinessException("图片上传失败");
            } catch (Exception e) {
                e.printStackTrace();
                throw new BusinessException("图片上传失败");
            }
        }
        return null;
    }

    public static void main(String[] args) {
        Integer expectFileSize = 200;//200KB
        Double scale = 1.0;
        Double quality = 0.1;
        String srcPath = "C:\\Users\\xxxx\\Desktop\\pics\\grape.jpg";
        String coreFilename = srcPath.substring(0, srcPath.lastIndexOf("."));
        String format = srcPath.substring(srcPath.lastIndexOf(".")+1);
        String desPath = String.format("%s-%1.1f-%1.1f.%s", coreFilename, scale, quality, format);
        ThumbnailUtil.compressPictureForScale(srcPath,desPath,expectFileSize, scale,quality, 0);
    }
}
QQ沟通交流群 本文作者千千寰宇
本文链接: http://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文转载于网络 如有侵权请联系删除

相关文章

  • 【WPSJS开发】使用Winform拖拉控件的方式可视化html页面布局

    相信不少使用传统OFFICE开发技术的开发人员,对Winform的控件拖拉再自然不过了,无论是VBA的窗体,还是VSTO的窗体,都是一样的套路,拖拉控件绑定事件,一切都再自然不过了。但来到网页开发中,面对的是一堆纯代码文本化的html,一下子感觉十分头痛,过去的知识完全不适用了。笔者前面文章也分享到,网页开发中,很多需要使用框架来完成,不用框架,纯原生html的效率是非常低的。在前文中,笔者提及可以学一下bootstrap这样的轻量化框架,可以快速地排版出许多网页效果,例如笔者做好的一个多图片轮播图功能,就是用的bootstrap框架里的轮播图功能完成。但这些都不足够易用,还是需要自己懂好多html特别是div+css的知识。直到再慢慢地摸索中,发现了一个网站工具magicalcoder,可以在线可视化布局html页面和控件,其网址为:http://lowcode.magicalcoder.com/magicalcoder/index-layui.html。刚好笔者后面除了bootstrap的学习外,也学习了一款比较热门的适合后端开发者使用的网页框架layui,在这个网站布局器工具里也

  • 数值分析复习(二)拉格朗日插值法、插值余项与误差估计

    拉格朗日插值法在数值分析复习(一)线性插值、抛物线插值中我们讨论过线性插值与二次插值,其实都是接下来要讲的拉格朗日插值的特殊情况,接下来我们一一分析:定义插值基函数:若n次多项式在n+1个节点上满足条件:就称这n+1个n次多项式为节点上的n次插值基函数。引入记号:拉格朗日插值多项式可变换为:当n=1时,,为线性插值当n=2时,,展开后可得抛物线插值注:n次插值多项式通常是次数为n的多项式,特殊情况下次数可能小于n,如当二次插值多项式插值的三点共线时将退化为一次多项式插值余项与误差估计设为插值多项式的截断误差,也称余项有如下定理: 通过余项表达式我们可以知道,若插值函数(代表次数小于等于n的多项式集合),由于,故,即它的插值多项式为其本身。

  • 免疫荧光分析误区,别踩雷了!

    好久没提到实验相关的内容,都快忘记自己是搞实验出身的了。 最近,陆陆续续有多个粉丝朋友在后台咨询关于“免疫荧光”的问题,基本都是在问免疫荧光分析的问题。 问题来了。 “免疫荧光到底该不该分析?” 关于这个话题,我想细致地采用一问一答的方式进行讨论。这样,读到这篇文章的人不会产生混乱的感觉。 问题1:什么是半定量分析? 答:对于一些指标,我们无法检测其绝对的含量,只能通过设置参照指标,以参照指标的倍数来反映目标物相对含量,这个“相对”是针对参照的。分析结果是半定量的,也是没有单位的,因为它本质上是一个比值(目标/参照)。 因此,参照指标的含量在任何情况下是恒定的,否则就是刻舟求剑。这句话的含义可以再延伸一下,即只要在被测物中存在一个恒定已知量,就可以采用它作为参考进行半定量分析。问题2:举例说明哪些指标是典型的半定量分析?答:①WesternBlot、ELISA、RT-PCR实验,经常采用GAPDH、β-actin等管家蛋白作为内参照,进而分析蛋白的相对表达量。 ②免疫组织化学染色(DAB法)、免疫细胞化学染色(DAB法)。同样也是采用GAPDH、β-actin等管家蛋白作为参照,通过在

  • Web前端学习 第3章 JavaScript基础教程13 面相对象

    一、面相对象概述首先面向对象是一种编程思想,是一种通过多个对象互相协作完成处理流程的编程思路【是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型】 推及到广义上,面向对象已经越了程序设计和软件开发,我认为面向对象又是一种思维方式,不局限于编程语言,甚至不局限编程本身,它把复杂的需求、业务逻辑抽丝剥茧、逐个分析。 主要分为:类的声明定义、对象的创建使用、面向对象拥有的特征【三大特征:封装、继承、多态】 封装:体现了对象对于敏感数据的保护特征 继承:体现了代码的复用和功能的扩展 多态:体现了不同操作环境中代码的多样性【程序的健壮性】 思路:大量的程序开发—软件的开发—解决问题—处理数据—CRUD【增删改查】二、基于原型的面向对象在ES2015版本之前,JavaScript是没有类的概念的,我们可以使用构造函数来模拟一个类,这在我们之前的课程中已经讲解过了,这里我们简单复习一下。创建一个猫的构造函数1functionCat(name,age){ 2this.name=name; 3this.age=age; 4} 5 6varcat=newCat("mia

  • CentOS安装nginx

    安装nginx第一步,查看是否安装,没有我们就开始安装:rpm-qa|grepnginx复制第二步,安装依赖包。(1)gcc安装。由于nginx是c语言写的,因此在安装nginx前需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,则需要安装:yuminstallgcc-c++;(2)PCREpcre-devel安装。PCRE(PerlCompatibleRegularExpressions)是一个Perl库,包括perl兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库,pcre-devel是使用pcre开发的一个二次开发库,nginx也需要此库。安装命令为:yuminstall-ypcrepcre-devel;(3)zlib安装。zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在Centos上安装zlib库。安装命令为:yuminstall-yzlibzlib-devel;(4)OpenSSL安装。OpenSSL是一个强大的安全套接字层密码库,囊括

  • Serverless DB 设计解读和实战

    哈喽小伙伴们,我们都知道数据库在项目开发中往往是不可或缺的一环,而在云计算热度不断提升的背景之下,我们对于使用数据库的成本以及灵活性有了更高的要求。Serverless团队近期新发布了两款组件来填补这最关键的一块拼图——ServerlessDB!下面我们一起来看看吧!ServerlessPostgreSQL组件PostgreSQLforServerless是一款基于PostgreSQL数据库实现的按需分配资源的数据库产品,其数据库将根据用户的实际请求数来自动分配资源。通过PostgreSQLServerlessDB组件,用户可以快速方便地创建、配置和管理腾讯云的PostgreSQL实例。产品有以下特性:低成本:产品按照用户使用的计算资源和容量来计费,没有请求时无需付费,减少使用成本。方便配置:默认配置将由Serverless为用户完成,用户也可自行在yaml文件中更改,短短几行即可完成配置工作,方便用户更好地关注自身业务逻辑。极速部署:部署过程流畅快捷,仅需几秒,即可创建或更新数据库。高可用:PostgreSQLforServerless支持一主一备高可用,当主实例出现意外导致不可用时

  • 一个API调用27个NLP预训练模型:BERT、GPT-2全囊括,像导入NumPy一样容易

    鱼羊发自凹非寺 量子位报道|公众号QbitAI只需一个API,就能调用BERT、XLM等多种语言模型,逆天的GPT-2也一样轻松到碗里来,这样的模型库你是否期待?现在,真的有人完成了这一惊人工作,推出了堪称最先进的自然语言处理预训练模型库。六种架构,27个预训练模型,简单易用,鹅妹子嘤。其名为Pytorch-Transformers1.0。登场数小时,获赞1000+,网友忍不住惊叹:这简直就是上帝的工作。Pytorch-Transformers1.0从模型分析到生产加速,对自然语言处理研究人员来说,简直是一库在手,天下我有。目前这个库中包含PyTorch实现,预训练模型权重,数据集和六个模型的转换工具。六种NLP模型库中囊括了现在自然语言处理(NLP)领域最常用的六种模型:BERTGPTGPT-2Transformer-XLXLNetXLM这些实现已经在GLUE、SQuAD上进行了测试,基本能与原始实现的性能相匹配。△BERT原始实现性能△Pytorch-Transformers1.0中BERT实现性能27个预训练模型快速上手这么强大的工具,上手也很简单。作者已经在Python2.7和

  • 18.Elasticsearch更新文档4---局部更新3---restAPI

    在更新整个文档,我们已经介绍过更新一个文档的方法是检索并修改它,然后重新索引整个文档;然而,使用updateAPI我们还可以部分更新文档,例如在某个请求时对计数器进行累加(比如博客的被访问次数)。前面介绍过文档是不可变的:他们不能被修改,只能被替换。updateAPI必须遵循同样的规则。从外部来看,我们在一个文档的某个位置进行部分更新。然而在内部,updateAPI还是简单使用与之前描述相同的:检索-修改-重建索引的处理过程。区别在于这个过程发生在分片内部,这样就避免了多次请求的网络开销。通过减少检索和重建索引步骤之间的时间,我们也减少了其他进程的变更带来冲突的可能性。update请求最简单的一种形式:是接收文档的一部分作为doc的参数,它只是与现有的文档进行合并。对象被合并到一起,覆盖现有的字段,增加新的字段。1.我们先查询出一个现有的文档:GET/policy_document/policy_document/222复制{ "_index":"policy_document", "_type":"policy_d

  • 不满足于宜家家具?MIT木工AI机器人,低成本打造定制化家具

    每一年都有数以千计的木工在切割木板的时候受伤。用手扶着木板往电锯那送的时候,手指离电锯很近,看着都心悸。为了把这种危险系数降到最低,MIT的计算机科学与人工智能实验室CSAIL研发了一种自动切割的机器,AutoSaw,帮助没有木工相关经验的普通人轻松切割出各种形状的木材,并在AutoSaw系统的指导下,DIY组装成个性化的家具。△AutoSaw,自动切割机器相关论文已被5月的机器人及自动化国际会议录取。共同作者有Lipton,Rus,和PhD学生AdrianaSchulz,MIT教授WojciechMatusik,PhD学生AndrewSpielberg,和本科生LuisTrueba。用户可以在这套系统上,选出木匠提前设计好的家具模板,家具可以是椅子、桌子、或者别的。MIT这个研究团队还提到,这套机器最后可用到甲板或拱门切割类似的巨型木头项目上。“如果要造一个甲板,就不得不涉及到大块的木头的定尺切割(cuttolength)。而大型木材的切割,一般都得在现场完成。”这篇论文的领衔作者JeffreyLipton,CSAIL的博士后谈到,“把手放在电锯旁边,都得面临受伤的风险。所以我们希望

  • 原来Silverlight 4中是可以玩UDP的!

    Silverlight3中的scoket只支持tcp协议,而对于udp一直以安全原因拒绝支持,但在silverlight4中可以惊喜的发现System.Net.Sockets下多出了二个类:UdpAnySourceMulticastClient,UdpSingleSourceMulticastClient根据msdn官方的解释:http://msdn.microsoft.com/en-us/library/system.net.sockets(VS.96).aspx UdpAnySourceMulticastClient: Aclientreceiverformulticasttrafficfromanysource,alsoknownasAnySourceMulticast(ASM)orInternetStandardMulticast(ISM). UdpSingleSourceMulticastClient: Aclientreceiverformulticasttrafficfromasinglesource,alsoknownasSourceSpecificMulticast(

  • 二值形态学之击中击不中变换

    击中击不中变换(HitMissTransform,HMT),是通过同时探测图像的内部和外部,进而获取更多的内外标记,体现更多信息的一个方法。他的应用有很多,特别是在图像识别以及图像细化方面。定义既然既要有击中也要有击不中,那么显然我们需要两个结构基元E和F,我们把这两个结构基元记为一个结构元素对B=(E,F。其中一个用来探测图像内部,一个用来探测图像外部。对于给定的图像A,我们定义用B对他进行的击中击不中变换为A*B=(A\ThetaE)\bigcap(A^c\ThetaF)即用E对A进行腐蚀,用F对A的补集进行腐蚀,并将得到的结果求交集。这样说可能冠冕堂皇了一点,简单的讲其实就在判断图像中的某一个像素,将这个像素与结构基元的‘原点'对应,看看结构基元中的‘击中’基元是否能完全被图像覆盖、结构基元中的‘击不中部分’是否能与图像没有任何交集。如果答案均为是,那么这个点就可以得到保留,否则就舍弃。当然,这里用了腐蚀的方法使得图像更加容易被识别进去。说白了一点其实就是相当于在用一个模子来测试这个图片,并将所有符合这个模子的中心点标记下而已。应用物体识别这个很显而易见了,只要将击中基

  • 接口测试-jmeter篇

    工具:jmeter3.3、FiddlerEverywhere、chrome FiddlerEverywhere只是相对我以及我的工作日常是相对方便的,所以选择了这个工具 以申请表单-审批表单为例 1.    2.添加cookie管理器,整个流程设置一个就可以,用于管理cookie,添加好就可以,不需要设置什么,    3.写接口    上边这是这个流程的第一个接口,是一个登录接口,所以我也添加了一个用户参数,添加了一些公共变量,用于下面的所有接口进行调用    这是打印结果: myApplyDate=2021-04-21myApplyDate13=1618964976326myApplyDateTZ=2021-04-21T08:29:36.326Z 还添加了一个HTTP头信息管理器,这也是不可或缺的这里面的参数以及上边需要填写都可以通过FiddlerEverywhere进行查看 比如淘宝网        参数尽量都写全,因为有些接口运行失败就是因为缺少参数的缘

  • Part 4系统编程之进程---进程同步

    (一)简介 通过之前的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制。尽管并发编程让我们能更加充分的利用IO资源,但是也给我们带来了新的问题:当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。例如下列情形--多进程抢占输出资源: 1importos 2importtime 3importrandom 4frommultiprocessingimportProcess 5 6defwork(n): 7print('%s:%sisrunning'%(n,os.getpid())) 8time.sleep(random.random()) 9print('%s:%sisdone'%(n,os.getpid())) 10 11if__name__=='__main__': 12foriinrange(3): 13p=Process(target=work,args=(i,)) 14p.start() 15 16 17》》》输出: 181:16548isrunning 190:1448isrunnin

  • shebang是啥

    在计算领域中,Shebang(也称为 Hashbang )是一个由井号和叹号构成的字符序列 #! ,其出现在文本文件的第一行的前两个字符。在文件中存在Shebang的情况下,类Unix操作系统的程序加载器会分析Shebang后的内容,将这些内容作为解释器指令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数[1]。 例如,以指令#!/bin/sh开头的文件在执行时会实际调用/bin/sh程序(通常是 Bourneshell 或兼容的 shell,例如 bash、dash 等)来执行。这行内容也是 shell脚本的标准起始行。 由于 # 符号在许多脚本语言中都是注释标识符,Shebang的内容会被这些脚本解释器自动忽略。在 # 字符不是注释标识符的语言中,例如 Scheme,解释器也可能忽略以 #! 开头的首行内容,以提供与Shebang的兼容性[2]。 "Shebang"或者说"Hashbang"的名字

  • window批处理——bat文件的编写

    BAT批处理脚本教程   第一章批处理基础第一节常用批处理内部命令简介批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。了解了大概意思后,我们正式开始学习.先看一个简单的例子!@echooffecho"欢迎来到非常BAT!"pause把上面的3条命令保存为文件test.bat或者test.cmd然后执行,他就会在屏幕上显示以下二行话:欢迎来到非常BAT!请按任意键继续...这就是一个简单批处理文件了,这个批处理文件一共就用了2条命令"echo"和"pause"还有一个特殊符号"@"从上面这个简单的批处理中,我们可以发现其实批处理就是运用一些含有特殊意义的符号和一些完成指定功能的命令组合而成,那么在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解一下一些最常用的!(以下内容来源网络,请各位仔细阅读,好进入下节的实例说明)==========================================

  • git提交代码到远程仓库

    1、仓库初始化 gitinit 2、连接仓库 gitremoteaddorigin仓库地址 3、查看状态 gitstatus 4、将文件添加到暂存区 gitadd状态里的新文件 5、将文件添加到仓库 gitcommit-m'相关注释文字' 6、将本地代码提交到远程仓库 gitpushoriginmaster

  • 归并排序

    归并排序介绍: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。   归并排序思想示意图1-基本思想:   归并排序思想示意图2-合并相邻有序子序列:   再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将 [4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤             归并排序的应用实例: 给你一个数组,valarr=Array(8,4,5,7,1,3,6,2),请使用归并排序完成排序。   代码: importjava.text.SimpleDateFormat; importjava.util.Arrays; imp

  • 【转载】 中国软件开发工程师之痛

    本文转载自http://blog.csdn.net/hzliyun/article/details/9417085 在近期的一次会议上,有高层谈到之前在中国觉得自己做得很牛,但与美国同行接触后却发现与人家存在很大的差距,这一点我在外企工作时也有过同样的体会。真正与外国同行接触后才会知道什么是差距,在这篇文章中我从软件开发工程师的角度以“痛点”的形式来谈一谈我所认为的差距。   技能之痛 相当数量的软件开发工程师(后面简称为工程师)认为除了与编码相关的内容外,其他技能都不重要。在这种意识的引导下,很容易出现的一个普遍现象是技术能力不错,但开发能力却不行。这种现象的另一种表现是:单干可以,合作不行。   技术能力是指个体对某些技术知识掌握的深度和广度,而开发能力除了包含技术能力外,还涵盖个体在项目运作过程中所需掌握的其他能力。   高效的团队一定离不开通过知识管理将个体所掌握的知识通过分享而沉淀下来。分享途径无外乎通过一定形式的文字和(或)图,这就要求工程师掌握使用象Word、PowerPoint、Excel、Visio(和UML)这类工具的基本能力,并具备良

  • 选择类排序

    一、简单选择排序(SimpleSelectionSort) 1.时间复杂度:O(n2) 2.空间复杂度:O(1) 3.实现: 1voidSelectSort(int*a,intn){ 2inti,j,min; 3for(i=1;i<n;i++){ 4for(min=i,j=i+1;j<n;j++){//选择最小的记录 5min=a[j]<a[min]?j:min; 6} 7if(i!=min){//与第i个记录交换 8a[0]=a[i]; 9a[i]=a[min]; 10a[min]=a[0]; 11} 12} 13}复制 二、堆排序(HeapSort) 1.时间复杂度:nlog2n 2.空间复杂度:O(1) 3.实现: 1voidHeapAdjust(int*a,intn,ints){//使数组a[s..n]成为大顶堆 2inti; 3a[0]=a[s]; 4for(i=2*s;i<=n;i*=2){ 5if(i<n&&a[i]<a[i+1]){ 6i++;//i为较大记录的下标 7} 8if(a[0]>a[i]){ 9

  • 数值分析第1章

    数值计算的误差来源 模型误差:数学模型与实际问题之间的误差 截断误差(方法误差):近似解与精确解之间的误差 舍入误差:由于计算机字长有限与计算过程而产生的误差 主要讨论截断误差与舍入误差 误差 绝对误差: \(x\)为准确值,\(x^{*}\)为近似值,称\(e^{*}=x^{*}-x\)为近似值的绝对误差,简称误差 误差限: 误差绝对值的一个上界,就是根据测量工具或计算情况估计出误差的绝对值不超过的某个整数\(\epsilon^*\),\(\epsilon^*\)叫做近似值的误差限 相对误差: 我们把近似值的误差\(e^*\)与准确值\(x\)的比值\(\frac{e^*}{x}=\frac{x^*-x}{x}\)称为近似值\(x^*\)的相对误差,记作\(e^*_r\) 但由式子我们可以看到,由于准确值我们无从得知,因此为了计算相对误差,通常取\(e^*_r=\frac{e^*}{x^*}=\frac{x^*-x}{x^*}\) 相对误差限: 相对误差的绝对值上界叫做相对误差限,记作\(\epsilon^*_r\),即\(\epsi

  • Rsync数据备份

    今天我在这里澄清一下啊,我前两天没写博客,不是因为我不会,而是因为我没做项目,是因为我做的时候忘了,截图,我这个人太正直,所以不想作弊,也没问人要图片。昨天没写是因为,两个虚拟机运行起来我的小DEll就卡死,要不就是蓝屏,它肯定很难受,我不想让他难受,所以没做。然后呢,我听见二哥的提议,买个内存条,我直接买个8GB的超级无敌牛牛内存条,不贵,不到1K。了了动静。过几天就到了,我就开始做作业了写博客了,唉,心塞塞

相关推荐

推荐阅读