连接n个字符串而重复的使用+,需要n的平方级别的时间?为什么?
来源:互联网 发布:bi域名 编辑:程序博客网 时间:2024/04/29 19:13
Efftive Java第51条: 当心字符串连接的性能,当连接n个字符串而重复地使用字符串连接操作,需要n的平方级的时间。
原因:字符串不可变,所以当两个字符串被连接在一起时,它们的内容都需要拷贝。
结论:当需要做多个字符串连接操作时,为了提高性能,应该使用StringBuilder的append方法,如果没有同步(单线程)问题也可以用StringBuffer类的append方法。
问题:为什么为连接n个字符串而重复的使用+,需要n的平方级别的时间?
证明:
第一次 a1+a2
拷贝次数 1 1
a1a2=a1+a2 共计1+1+1=3次
第二次 a1a2 + a3
拷贝次数 2 1
a1a2a3 = a1+a2+a3 共计 1+2+2*1+1=6次
第三次 a1a2a3 + a4
拷贝次数 3 1
a1a2a3 = a1+a2+a3 共计1+2+3+3*1+1=10次
依此类推
第n次 a1a2...a(n-1) + a(n)
拷贝次数 n-1 1
a1a2...a(n-1)a(n) 共计 1+2+3+(n-1)+1 = 1+2+3+(n-1)+n = n*(n+1)/2
以a1+a2+a3的连接为例,具体过程图解如下:
上面过程为我自己琢磨的,如果理解有错,望指证。
- 连接n个字符串而重复的使用+,需要n的平方级别的时间?为什么?
- 找出n个数字的中位数至少需要的时间
- 给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
- 给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
- 给定一个字符串,查找该字符串中第一个重复出现的字符索引。要求:时间复杂度为O(n)。
- 检查一个数组是否出现重复数字的算法(时间复杂度O(n的平方))
- 把正整数 n 转化成最少个数字的平方
- 返回第n个无平方数因数的数
- 重复一个指定的字符串 n次
- n个不重复的随机数
- 取N个不重复的随机数
- 生成N个不重复的随机数
- 生成N个不重复的随机数
- 产生n个不重复的随机数
- n个不重复的随机数
- 1的平方加到n的平方
- 求<=N的平方数
- 时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- rsync配置和使用
- andorid 反编译
- 一些常用shell脚步
- UVA 10791 - Minimum Sum LCM(数论)
- uva-10106
- 连接n个字符串而重复的使用+,需要n的平方级别的时间?为什么?
- 时间函数总结
- 高性能自旋锁 MCS Spinlock 的设计与实现
- OCP-1Z0-053-V13.02-687题
- android 二维码识别技术分享
- Fragment使用时出现错误:he specified child already has a parent. You must call removeView() on the child's p
- Android学习篇章50-MediaStore-Intent启动照相
- jquery发送ajax请求返回数据格式
- 【Oracle】Oracle简介