- 浏览: 343480 次
- 性别:
- 来自: 北京
-
文章列表
归并排序,时间复杂度O(nlgn),相比快速排序和堆排序,优势是排序稳定。通过两两分拆、归并实现。在子数组长度小于等于7(一说50)时可采用插入排序来提高效率(但我在本机上测试,两者带来的提升并不明显)。JDK自带的Collections.sort方法采用的即是归并排序。
public class MergeSort {
private int[] temp;
public void sort(int arr[], int start, int to) {
if (arr == null || arr.length == 0 || start < 0 || end ...
建立堆的时间复杂度为O(n),随后的排序为O(nlgn);常用于取前K大/小的应用。
public void heapSort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
for (int i = arr.length / 2; i >= 0; i--) {
buildHeap(arr, i, arr.length - 1);
}
//将堆进行排序.
for(int j=arr.length-1;j>=1;j--){
swap(arr, ...
直接插入排序。
public void sortWithIndex(Integer arr[], int from, int to) {
if (arr == null || to > arr.length - 1||from<0) {
return;
}
for (int i = from + 1; i <= to; i++) {
int temp = arr[i];
int j = i;
for (; j >= from + 1; j--) {
if (temp >= arr[j-1]) {
...
希尔排序是简单插入排序的优化。插入排序在数组基本有序的情形下非常高效,希尔排序则通过创造这种环境,并最终进行一次整体的插入排序实现性能的优化。
代码如下:
/**
*
* @param arr 待排序数组
* @param group 分组数
*/
public void shellSort(Integer[] arr, int group) {
if (arr == null || group <= 0) {
return;
}
for (int gap = arr.length / group; gap >= 1; g ...
客户端从服务器请求数据经历如下基本步骤:
1、如果请求命中本地缓存则从本地缓存中获取一个对应资源的"copy";
2、检查这个"copy"是否fresh,是则直接返回,否则继续向服务器转发请求。
3、服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。
4、客户端更新本地缓存。
no-cache的作用是:强制客户端跳过步骤2,直接向服务器发送请求。也就是说每次请求都必须向服务器发送。
must-revalidate:作用与no-cache相同,但更严格,强制意味更明显。但这只是理论上的描述,根据我在f ...
ETag和Last-Modified用法上的区别是:ETag必须由开发人员来使用,而Last-Modified服务器会自动判断。也就是说服务器自己能够获取文件的"Last-Modified"并和"If-Modify-Since"进行对比,进而决定发送什么样的响应。而ETag则必须由开发人员自己来和"If-None-Match"进行比较判断。
加上ETag一个用途是,假如文件被编辑了,但实际上内容并没有变化,此时可以指定ETag的值不变,这样它和浏览器发送过来的"If-None-Match"的值就相等了 ...
http协议-缓存控制:max-age
- 博客分类:
- http协议研究
打算将cache-control的各个值都试一遍,看看最终效果是否和预期一致。
先尝试max-age。其作用是:假如请求了服务器并在a时刻返回响应结果,则在max-age规定的秒数内,浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。
设置max-age的方式是tomcat的filter。
package itims;
public class TestHTTP implements Filter{
private static transient Log logger = LogFactory.g ...
闲来无事做了个文件下载的功能,这还是第一次做的说,不知道会不会遭BS。
请自备jQuery环境。
(function($){
var _cf = window["configFile"] = {LoginModel:function () {}};
_cf.LoginModel.prototype={
/**
* 下载配置文件
*/
downloadBk : function(fBKName,mosn){
var action = window["path"]+"/bk_downloadBk. ...
判断日期格式
- 博客分类:
- JavaScript/CSS
var startTime = "2011-03-31 12:33:30";
var reg = /^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([1 ...
mysql触发器创建细节
- 博客分类:
- 数据库使用经验
看起来学习成本不大的东西真要真刀实枪地跑通,细节还是挺多的。
一、删除触发器。
DROP TRIGGER DEL_TR;
看到很多例子都是这样的:DROP TRIGGER IF EXISTS xxx;但我的mysql版本上根本就不支持对触发器的IF EXISTS.
mysql> select version();
+---------------------+
| version() |
+---------------------+
| 5.0.27-community-nt |
+---------------------+
1 row ...
模仿《javascript权威指南》写了个简易拖拽程序,麻雀虽小五脏俱全。
原理:注册mousemove事件,使元素跟随鼠标挪动;注册mouseup事件,移除mousemove事件,使得松开鼠标时元素不再跟随移动,能够固定在指定位置。在mousedown事件中注册mousemove事件和mouseup事件,这样便可完成一次完整的拖拽。
重点:IE中setCapture()的应用。它的作用是捕捉所有的MouseEvent,设置完成后,即使鼠标移出窗口注册的鼠标事件仍然能够被触发。它在此处的作用是当鼠标移动过快越出元素的边界使得原本将要失效的mousemove事件依然能够发挥作用。在ff和chro ...
参考了如下链接,备忘一下:
DOM事件模型
见下图:
标准DOM2的事件传播模型分2个阶段:
首先是捕获阶段(capture prase):从document对象起向下传播,直至到达目标对象(此过程IE不支持)。若目标对象的父节点注册了捕捉型的事件处理 ...
想明白了,什么都是浮云
- 博客分类:
- 编程心得
完成任务、解决问题的能力才是最重要的。技能只是手段,使用技能实现预定目标才是目的。所以人家更关注你能做出什么成果,而不是你会什么技能。这更加坚定了我之前的想法:必须扩大自己的业务领域,而不是仅仅沉溺于技术本身;要是这个技术还被认为是屠龙之术那就杯具了。
有人在踩...其实不是在否定技术,而是强调在学习技术时要时时关注它能给自己带来什么。
面向抽象编程通俗理解
- 博客分类:
- 编程心得
程序要隔离变化:首先要抽象、剥离出固定的部分,即使剩余部分再怎么变化,它也是不变的;做到这一点就必须使程序依赖于抽象,而不依赖于实现;这里的“抽象”应该从广义上理解,它可以是interface也可以是抽象类,可以利用ioc,甚至一个方法都行,总之,这部分不能使用具体的实现。
举个生活中的例子:小明接到一个电话找他爸爸,但恰好他不在家,于是小明告诉对方晚点再打过来。过一会儿爸爸回来了,但刚才对方是谁小明忘了问,那他怎么向爸爸介绍这个人呢?
1、刚才有同事给你打电话了;
2、刚才有朋友给你打电话了;
3、刚才有个男的给你打电话了;
4、刚才有人给你打电话了。
小明会选句?随便点的就会选第 ...
public void testMixedAddition() {
Expression fiveBucks= Money.dollar(5);
Expression tenFrancs= Money.franc(10);
Bank bank= new Bank();
bank.addRate("CHF", "USD", 2);
Money result= bank.reduce(fiveBucks.plus(tenFrancs), "USD");
assertEquals(Money ...