当前位置:  编程技术>移动开发
本页文章导读:
    ▪自定义哈希表的性能估测        自定义哈希表的性能评测 作为一个程序员或一个软件工程师,hash(散列)必然是熟解的。 对于百万级,甚至更多的数据的数据,我们如何实现存储并不太难,可我们要实现快速的增添查找删.........
    ▪ Hudson的配备        Hudson的配置 1.下载hudson的war包 http://hudson-ci.org/download/war/ 2.解压替换mail-1.4.jar包 直接下来的包不能用、发邮件会有问题 3.svn上建出项目、eclipse check out... 4.hudson放入tomcat 的webapp目录、.........
    ▪ AnalogClock钟表       AnalogClock时钟 一、AnalogClock时钟显示时间 protected static final int GUINOTIFIER = 0x1234; private TextView mTextView; public AnalogClock mAnalogClock; public Calendar mCalendar; public int mMinutes; public int mHour; public .........

[1]自定义哈希表的性能估测
    来源: 互联网  发布时间: 2014-02-18
自定义哈希表的性能评测
作为一个程序员或一个软件工程师,hash(散列)必然是熟解的。

对于百万级,甚至更多的数据的数据,我们如何实现存储并不太难,可我们要实现快速的增添查找删,显然普通的数组和链表是满足不了的。数组可以满足快速的查找,链表可以实现随意的删除,我们由此不难得到一种数据结构:数组挂链表的结构,称挂链式。

以一般的数据结构实现哈希过程,在实际中会遇到比较大的问题,我们在此选择使用挂链式,作为解决hash冲突的一种解决策略。当有不同的key在hash()后得到想的hashcode的时候,我们选择在哈希表结点上悬挂链表。而当我们的数据虽时间变化的时候,显然,冲突越来越严重,我们需要解决这个问题。在冲突达到一定程度时,我们队哈希表进行扩张,对原哈希表的数据进行rehash()。

不难想象到,rehash()是一个浪费时间与空间的过程,可这是没有办法的事,因为两全其美的事不存在,我们只能根据实际情况,取舍。


自定义哈希表的结构

①hash():哈希表实现快速增删查的根本,通过hash()对每一个key 得到唯一的一个索引,而这个索引就如身份证号,查找删除数据时只需知道与此数据相匹配的索引;

②解决冲突的方法:冲突指的是当不同的数据的key通过hash()得到相同的索引位置而提供的解决方法,此处此方法为挂链式;

③rehash():当哈希表中的数据达到一定的值时,成为阀值,因为此刻由于数据的增多,索引的速度必然受到影响,而解决的方法就是对数组拓展,重新的hash().


class HuHash{

  private Node<Item> [] list=new Node<Item> [len];

  public boolean put(K k,V v){
     if(冲突严重){
         rehash()
     }
     int index=hash(k)%len;
     Node<Item> node=new Node<Item>(k,v);  
     if(list[index]==null){
        
     }
     
  }

  public boolean get(K k){
  
  }
 
  public boolean hash(K k){
  
  }
  
  public boolean rehash(){
  
  }

}


class Node<Item>{
  private Node parent;
  private Node next;
}

class Item{
   
}


性能对比(见附件):



代码实现如下:
package hash实现;

/**
 * 哈希的实现类
 * 
 * @author lenovo
 * 
 */
public class MyHash<K, V> {

	private int len;
	private Node[] list;
	private int count; // 计数器

	public MyHash(int len) {
		this.len = len;
		list = new Node[len];
		count = 0;
	}

	/**
	 * 添加元素的方法
	 * 
	 * @param key
	 *            :键
	 * @param value
	 *            :
	 * @return
	 */
	public void put(K key, V value) {
		if (count >= 1.25 * len) { // 冲突的严重性
			rehash();
		}
		int index = hash(key) % len;
		Item<K, V> it = new Item(key, value);
		Node node = new Node(it);
		if (list[index] != null) { // 判断是否为空结点
			// 添加到链表头
			Node temp = list[index];
			node.setNext(temp);
		}
		list[index] = node;
		count++;
	}

	public V get(K k) {
		int index = hash(k) % len;
		Node temp = list[index];
		while (temp != null) { // 判断此数组索引是否为空
			if (temp.getItem().getK().equals(k))
				return (V) temp.getItem().getV();
			temp = temp.getNext();
		}
		return null;
	}

	/**
	 * 根据键移除hash表中的数据
	 * 
	 * @param k
	 * @return 若存在则返回true
	 */
	public boolean remove(K k) {
		if (count == 0) {
			throw new RuntimeException("哈希表中无元素,删除操作拒绝!");
		}
		int index = hash(k) % len;
		Node temp = list[index];
		while (temp != null) { // 判断此数组索引是否为空
			if (temp.getItem().getK().equals(k)) {
				list[index] = temp.getNext();
				count--;
				return true;
			}
			temp = temp.getNext();
		}
		return false;
	}

	/**
	 * 得到哈希表中元素的个数
	 * 
	 * @return
	 */
	public int size() {
		return count;
	}

	/**
	 * SDBM散列方法
	 * 
	 * @param k
	 *            :键
	 * @return 哈希值
	 */
	private int hash(K k) {
		String str = (String) k;
		int hash = 0;
		char[] chars = str.trim().toCharArray();
		int num = 0;
		while (num < chars.length) {
			hash = (int) chars[num] + (hash << 6) + (hash << 16) - hash; // 进行移位运算
			num++;
		}
		return (hash & 0x7FFFFFFF); // 按位与(hash和0x7ffffff转换为二进制)
	}

	/**
	 * 再散列方法
	 */
	private void rehash() {
		len = len * 15; // 表长扩大的倍数
		Node[] temp = new Node[len]; // 存放rehash后数据的数组
		Node node;
		int index;
		for (int i = 0; i < list.length; i++) {
			node = list[i];
			while (node != null) {
				index = hash((K) node.getItem().getK()) % len;
				temp[index] = node;
				node = node.getNext();
			}
		}
		list = temp; // 复制数据
	}

}
 

package hash实现;
/**
 * 链表结点类,存放键值对
 * @author lenovo
 *
 */
public class Node {
	
	private Node next;
	private Item item;
	
	public Node(Item item){
		this.item=item;
		next=null;
	} 

	public Item getItem() {
		return item;
	}

	public void setItem(Item item) {
		this.item = item;
	}

	public Node getNext() {
		return next;
	}

	public void setNext(Node next) {
		this.next = next;
	}
	
}
 

package hash实现;
/**
 * 键值对
 * @author lenovo
 *
 */
public class Item<K,V> {

	private K k;
	private V v;
	
	public Item(K k,V v){
		this.k=k;
		this.v=v;
	}
	
	public K getK() {
		return k;
	}
	public void setK(K k) {
		this.k = k;
	}
	public V getV() {
		return v;
	}
	public void setV(V v) {
		this.v = v;
	}
	
	
}
 
其他参考的hash函数:

/**
	 * 一位接一位的hash函数
	 * 
	 * @param k
	 * @return
	 */
	private int oneByOneHash(K k) {
		String str = (String) k;
		int hash = 0;
		for (int i = 0; i < str.length(); ++i) {
			hash += str.charAt(i);
			hash += (hash << 10);
			hash ^= (hash >> 6);
		}
		hash += (hash << 3);
		hash ^= (hash >> 11);
		hash += (hash << 15);
		return hash;
	}
 

/**
	 * FNVHash 函数
	 * 
	 * @param k
	 * @return
	 */
	private int FNVHash(K k) {
		String str = (String) k;
		final int p = 16777619;
		int hash = (int) 2166136261L;
		for (int i = 0; i < str.length(); i++)
			hash = (hash ^ str.charAt(i)) * p;
		hash += hash << 13;
		hash ^= hash >> 7;
		hash += hash << 3;
		hash ^= hash >> 17;
		hash += hash << 5;
		return hash;
	}
 




    
[2] Hudson的配备
    来源: 互联网  发布时间: 2014-02-18
Hudson的配置
1.下载hudson的war包

  http://hudson-ci.org/download/war/

2.解压替换mail-1.4.jar包

  直接下来的包不能用、发邮件会有问题

3.svn上建出项目、eclipse check out...

4.hudson放入tomcat 的webapp目录、启动tomcat

5.浏览器输入 localhost:8080/hudson 进入hudson项目

6.hudson的配置
  
  manage hudson  ==>  configure system ==> 

# of executors   2  容许同时操作的项目数
Quiet period     5  scheduled 的项目开始build的延迟秒数
SCM checkout retry count  0  checkout失败后再次checkout的等待时间

可以再安全控制设置用户权限,其他的不用管

E-mail Notification:

SMTP server : prcsgihcs01.ad.***.com  发送邮件的服务器、不同公司不一样
Default User E-mail Suffix :@***.com  如@tencent.com
System Admin E-mail Address : 发送错误信息人的邮箱
Hudson URL : http://PRCHAZ10927D:8080/   http后面是计算机名

Use SMTP Authentication :

username 

password ...

SMTP Port 服务的端口号 ... 


7.新建项目进行配置

New Job.  项目名称随便、第一种 Build a free-style software project

Subversion    svn上的项目地址

Build==>invoke ant==> Targets (对于android应用来说) 
-Dadb.device.arg="-s emulator-5554" debug install

勾选 E-mail Notification 、

设置接收邮件的用户邮箱、空格隔开、
勾选 Send e-mail for every unstable build 

保存、搞定、如果需要每多久跑一次的话、

Build Triggers ==> Poll SCM 

* * * * * 表示每分钟跑一次、


==========另一种启动hudson的方式=====================

hudson自带一个轻量级的服务器、所以不一定需要部署在tomcat上、

右键解压hudson的war包、弹出的解压窗口上替换mail的jar包、关闭、

这样就更新了hudson的war包、注意不是解压后再打包成war、

这种方式会覆盖掉之前的文件、跑war包的时候报failed to load main-class manifest attribute from ...的错


1.运行 java -jar d:/hudson/hudson.war 启动hudson的服务

2.浏览器输出 localhost:8080 访问hudson的web页面、进行配置


    
[3] AnalogClock钟表
    来源: 互联网  发布时间: 2014-02-18
AnalogClock时钟

一、AnalogClock时钟显示时间

protected static final int GUINOTIFIER = 0x1234;
	
	private TextView mTextView;
	public AnalogClock mAnalogClock;
	public Calendar mCalendar;
	
	public int mMinutes;
	public int mHour;
	
	public Handler mHandler;
	private Thread mClockThread;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.clock);

		mTextView = (TextView) findViewById(R.id.myTextView);
		mAnalogClock = (AnalogClock) findViewById(R.id.myAnalogClock);

		mHandler = new Handler() {
			public void handleMessage(Message msg) {
				switch (msg.what) {
				case Clock.GUINOTIFIER:
					mTextView.setText(mHour + " : " + mMinutes);
					break;
				}
				super.handleMessage(msg);
			}
		};

		mClockThread = new LooperThread();
		mClockThread.start();
	}

	class LooperThread extends Thread {
		public void run() {
			super.run();
			try {
				do { 
					long time = System.currentTimeMillis();
					final Calendar mCalendar = Calendar.getInstance();
					mCalendar.setTimeInMillis(time);
					mHour = mCalendar.get(Calendar.HOUR);
					mMinutes = mCalendar.get(Calendar.MINUTE);
					Thread.sleep(1000);
					Message m = new Message();
					m.what = Clock.GUINOTIFIER;
					Clock.this.mHandler.sendMessage(m);
				} while (Clock.LooperThread.interrupted() == false); /* 当系统发出中断讯息时停止本循环 */
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
 


 

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3