当前位置:  编程技术>综合
本页文章导读:
    ▪图解后缀树,翻译了3个小时,你还不懂的话,找我       原文查看: http://www.ibaiyang.org/2013/01/06/suffix-tree-introduction/ 看过非常多的不靠谱suffix tree介绍后,本文是我在网上发现至今最好的一篇,通过三个规则讲述了整棵后缀树的构建过程,图形结合.........
    ▪VC写的界面漂亮、简洁的MP3播放器源码      本人用VC写的简单的、界面漂亮的MP3播放器。界面采用MFC框架,解码核心采用现成的COM组件,精美UI采用皮肤控件。内含程序+源码,VS2010编写。下载地址为: 点我下载   废话不说,先上.........
    ▪一个有用的类,集合了建立、连接热点;获取本机ip和连接此热点的手机的ip地址等方法      package dislab.gossipdog.wifi.adhoc; import java.io.BufferedReader; import java.io.FileReader; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList.........

[1]图解后缀树,翻译了3个小时,你还不懂的话,找我
    来源:    发布时间: 2013-11-07

原文查看:

http://www.ibaiyang.org/2013/01/06/suffix-tree-introduction/

看过非常多的不靠谱suffix tree介绍后,本文是我在网上发现至今最好的一篇,通过三个规则讲述了整棵后缀树的构建过程,图形结合,非常容易理解,并且本文尊重原作者Ukkonen的论文术语,清楚的讲解了出现在suffix tree中的每一个概念,花时3个小时翻译之,共勉,部分有修改和抛弃。

正文如下:

接下来我将通过一个简单的字符串(不包含重复的字符)来试着分析Ukkonen算法,接着来讲述完整的算法框架。

首先,一点简单的事前描述

1. 我们构建的是一个简单的类似搜索字典类(search trie)结构,所以存在一个根节点(root node)。树的边(edges)指向一个新的节点,直到叶节点。

2. 但是,不同于搜索字典类(search trie),边标签(edge label)不是单个字符,相反,每一个边被标记为一对整数[from, to]。这一对整数是输入字符串的索引(index)。这样,每一个边记录了任意长度的子字符(substring),但是只需要O(1)空间复杂度(一对整数索引)。

基本约定

下面我将用一个没有重复字符的字符串来说明如何创建一颗后缀树(suffix tree):

abc

本算法将从字符串的左边向右边一步一步的执行。每一步处理输入字符串的一个字符,并且每一步抑或涉及不止一种的操作,但是所有的操作数和是O(n)时间复杂度的。

好,我们现在将字符串左边的a插入到后缀树,并且将此边标记为[0, #],它的意思是此边代表了从索引0开始,在#索引结束的子字符串(我使用符号#表示当前结束索引,现在的值是1,恰好在a位置后面)。

所以,我们有初始化后的后缀树:

其意思是:

现在我们处理索引2,字符b。我们每步的目的是将所有后缀(suffixes)的结束索引更新当前的索引。我们可以这样做:

1. 拓展存在的a边,使其成为ab;

2. 为b插入一条新边。

然后变成这样:

其意思是:

我们观察到了二点:

  • 表示ab的边同我们初始化的后缀树:[0, #]。它意味着将会自动改变,我们仅仅更新#,使其成为2即可;
  • 每一步只需要O(1)的空间复杂度,因为我们只记录了一对整数索引而已。
  • 接下来,我们继续自增#索引,现在我们需要插入字符c了。我们将c插入到后缀树中的每一条边,然后在为后缀c插入一条新边。

    它们像下面:

    其意思是:

    我们注意到:

  •  在每一步后,恰好都是一颗正确的后缀树;
  • 总共需要字符串长度的数量的操作;
  • 所有的操作都是O(1)。
  • 第一次拓展:简单的重复字符串

    上面的算法工作的非常正确,接下来我们来看看更加复杂的字符串:

    abcabxabcd

    步骤1至3:正如之前的例子:

    步骤4:我们自增#到索引4。这将自动的更新所有已存在的边:


        
    [2]VC写的界面漂亮、简洁的MP3播放器源码
        来源: 互联网  发布时间: 2013-11-07

    本人用VC写的简单的、界面漂亮的MP3播放器。界面采用MFC框架,解码核心采用现成的COM组件,精美UI采用皮肤控件。内含程序+源码,VS2010编写。下载地址为:

    点我下载

     

    废话不说,先上几张图片:

     

     

    虽然功能简单但比较实用、简洁,可以最小化到托盘,自动按顺序播放下一曲。

    自己写的代码也就300行不到,注释很清楚,大家可以下载源码看。还有很多不足多多包涵。注意程序的运行离不开Mp3play.ocx  skinh.she  SkinHu.dll这三个文件,应该和exe放到同一目录下,Mp3play.ocx是用于解码的COM组件,skinh.she  SkinHu.dll就是皮肤资源和皮肤控件啦。

    作者:CharlesSimonyi 发表于2013-1-6 18:12:23 原文链接
    阅读:1 评论:0 查看评论

        
    [3]一个有用的类,集合了建立、连接热点;获取本机ip和连接此热点的手机的ip地址等方法
        来源: 互联网  发布时间: 2013-11-07
    package dislab.gossipdog.wifi.adhoc;
    
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.lang.reflect.Method;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.SocketException;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.net.DhcpInfo;
    import android.net.wifi.ScanResult;
    import android.net.wifi.WifiConfiguration;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
    import android.os.Bundle;
    import android.text.format.Formatter;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class AdHocActivity extends Activity {
    	private final String TAG = "WifiSoftAP";
        public static final String WIFI_AP_STATE_CHANGED_ACTION =
            "android.net.wifi.WIFI_AP_STATE_CHANGED";
    
        public static final int WIFI_AP_STATE_DISABLING = 0;
        public static final int WIFI_AP_STATE_DISABLED = 1;
        public static final int WIFI_AP_STATE_ENABLING = 2;
        public static final int WIFI_AP_STATE_ENABLED = 3;
        public static final int WIFI_AP_STATE_FAILED = 4;  
    	
        
        TextView result;
    	WifiManager wifiManager;
    	WifiReceiver receiverWifi;
    	List<ScanResult> wifiList;
    	//����l���б�  
        private List<WifiConfiguration> wifiConfiguration;
    	StringBuilder resultList = new StringBuilder();
    
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    
    		//setTitle("");
    		result = (TextView) findViewById(R.id.result);
    		wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    		
    		
    		Button btnOpenAP = (Button)this.findViewById(R.id.btnOpenAP);
    		btnOpenAP.setOnClickListener(new OnClickListener() {            
    			public void onClick(View v) {
    				if (!isApEnabled()){
    					setWifiApEnabled(true);
    				}
            	}
            });
    		
    		
    		Button btnCloseAP = (Button)this.findViewById(R.id.btnCloseAP);
    		btnCloseAP.setOnClickListener(new OnClickListener() {            
    			public void onClick(View v) {
    				if (isApEnabled()){
    					setWifiApEnabled(false);
    				}
            	}
            });
    		
    		
    		Button btnScan = (Button)this.findViewById(R.id.btnScan);
    		btnScan.setOnClickListener(new OnClickListener() {            
    			public void onClick(View v) {
    				if (!wifiManager.isWifiEnabled()) {
    					wifiManager.setWifiEnabled(true);
    				}
    				StartScan();
            	}
            });
    		
    		
    		Button btnConnectAP = (Button)this.findViewById(R.id.btnConnectAP);
    		btnConnectAP.setOnClickListener(new OnClickListener() {            
    			public void onClick(View v) {
    				connectAP();
            	}
            });
    		
    		
    		Button btnGetConnectedIP = (Button)this.findViewById(R.id.btnGetConnectedIP);
    		btnGetConnectedIP.setOnClickListener(new OnClickListener() {            
    			public void onClick(View v) {
    				ArrayList<String> connectedIP = getConnectedIP();
    				resultList = new StringBuilder();
    				for(String ip : connectedIP){
    					resultList.append(ip);
    					resultList.append("\n");
    				}
    				result.setText(resultList);				
    				
            	}
            });
           
    		
    		findViewById(R.id.btnGetOwmId).setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				Log.d("ZSM", getLocalIpAddress());
    				
    				WifiInfo wifiinfo = wifiManager.getConnectionInfo();
    				  Log.v("getBSSID", wifiinfo.getBSSID() + "");
    				  Log.v("getHiddenSSID", wifiinfo.getBSSID() + "");
    				  Log.v("getIpAddress", Formatter.formatIpAddress(wifiinfo.getIpAddress()) + "");
    				  Log.v("getLinkSpeed", Formatter.formatIpAddress(wifiinfo.getLinkSpeed()) + "");
    				  Log.v("getMacAddress", wifiinfo.getMacAddress() + "");
    				  Log.v("getNetworkId", Formatter.formatIpAddress(wifiinfo.getNetworkId()) + "");
    				  Log.v("getRssi", wifiinfo.getRssi() + "");
    				  Log.v("getSSID", wifiinfo.getSSID() + "");
    
    
    				DhcpInfo dhcpinfo = wifiManager.getDhcpInfo();
    				  Log.v("ipaddr", Formatter.formatIpAddress(dhcpinfo.ipAddress) + "");
    				  Log.v("gatewau", Formatter.formatIpAddress(dhcpinfo.gateway) + "");
    				  Log.v("netmask", Formatter.formatIpAddress(dhcpinfo.netmask) + "");
    				  Log.v("dns1", Formatter.formatIpAddress(dhcpinfo.dns1) + "");
    				  Log.v("dns1", Formatter.formatIpAddress(dhcpinfo.dns2) + "");
    				  Log.v("serverAddress", Formatter.formatIpAddress(dhcpinfo.serverAddress) + "");
    				  Log.d("ZSM", Formatter.formatIpAddress(dhcpinfo.serverAddress));
    				  Log.d("ZSM","ipaddr  "+ Formatter.formatIpAddress(dhcpinfo.ipAddress));
    				  
    				  
    			}
    		});
    		
    
    
    	}
    	
    	//此方法暂不可用
        public String getLocalIpAddress() {  
            try {  
                for (Enumeration<NetworkInterface> en = NetworkInterface  
                        .getNetworkInterfaces(); en.hasMoreElements();) {  
                    NetworkInterface intf = en.nextElement();  
                    for (Enumeration<InetAddress> enumIpAddr = intf  
                            .getInetAddresses(); enumIpAddr.hasMoreElements();) {  
                        InetAddress inetAddress = enumIpAddr.nextElement();  
                        if (!inetAddress.isLoopbackAddress()) {  
                            return inetAddress.getHostAddress().toString();  
                        }  
                    }  
                }  
            } catch (SocketException ex) {  
                Log.e("WifiPreference IpAddress", ex.toString());  
            }  
            return null;  
        }  
          
        public String getLocalMacAddress() {  
            WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
            WifiInfo info = wifi.getConnectionInfo();  
            return info.getMacAddress();  
        }  
    
    	protected void onPause() {
    		if (receiverWifi != null)
    			unregisterReceiver(receiverWifi);
    		
    		super.onPause();
    	}
    
    	protected void onResume() {
    		if (receiverWifi != null)
    			registerReceiver(receiverWifi, new IntentFilter(
    					WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    
    		super.onResume();
    	}
    
    	
    	public void StartScan() {
    		//��wifi
    		wifiManager.setWifiEnabled(true);
    
    		receiverWifi = new WifiReceiver();
    		registerReceiver(receiverWifi, new IntentFilter(
    				WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    		wifiManager.startScan();
    		result.setText("\nScaning...\n");  
    	}
    	
    	
    	public boolean setWifiApEnabled(boolean enabled) {
    		if (enabled) { // disable WiFi in any case
    			wifiManager.setWifiEnabled(false);
    		}
        	
    		try {
    			WifiConfiguration apConfig = new WifiConfiguration();
    			apConfig.SSID = "GossipDog";
    			apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    			apConfig.preSharedKey = "abcdefgh";
    			
    			Method method = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
    			return (Boolean) method.invoke(wifiManager, apConfig, enabled);
    		} catch (Exception e) {
    			Log.e(TAG, "Cannot set WiFi AP state", e);
    			return false;
    		}
    	}
    
    	
    	
    	public int getWifiApState() {
    		try {
    			Method method = wifiManager.getClass().getMethod("getWifiApState");
    			return (Integer) method.invoke(wifiManager);
    		} catch (Exception e) {
    			Log.e(TAG, "Cannot get WiFi AP state", e);
    			return WIFI_AP_STATE_FAILED;
    		}
    	}
    	
    	public boolean isApEnabled() {
            int state = getWifiApState();
            return WIFI_AP_STATE_ENABLING == state || WIFI_AP_STATE_ENABLED == state;
    	}
    
        
        //l��GossipDog  
        public void connectAP() { 
        	WifiConfiguration gossipDog = new WifiConfiguration();
            for (WifiConfiguration ap : wifiConfiguration) { 
            	if (ap.SSID == "GossipDog") {
            		gossipDog = ap;
            	}
            } 
            
            if (gossipDog != null) {
            	gossipDog.preSharedKey = "abcdefgh";
            	gossipDog.networkId = wifiManager.addNetwork(gossipDog);
            	wifiManager.enableNetwork(gossipDog.networkId, true);
            	result.setText("l��AP�ɹ�");
            } 
            
        }
        
        //获取所有连接到本wifi热点的手机IP地址
        private ArrayList<String> getConnectedIP() {
            ArrayList<String> connectedIP = new ArrayList<String>();
            try {
            	BufferedReader br = new BufferedReader(new FileReader("/proc/net/arp"));
                String line;
                while ((line = br.readLine()) != null) {
                	Log.d("meng", line);
                    String[] splitted = line.split(" +");
                    if (splitted != null && splitted.length >= 4) {
                        String ip = splitted[0];
                        connectedIP.add(ip);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            return connectedIP;
        }
    	 
    	class WifiReceiver extends BroadcastReceiver {
    
    		public void onReceive(Context c, Intent intent) {
    			resultList = new StringBuilder();
    			wifiList = wifiManager.getScanResults();
    			for (int i = 0; i < wifiList.size(); i++) {
    				resultList.append(new Integer(i + 1).toString() + ".");
    				resultList.append((wifiList.get(i)).toString());
    				resultList.append("\n\n");
    			}
    			result.setText(resultList);
    			
    			//�õ����úõ�����l��  
    		    wifiConfiguration = wifiManager.getConfiguredNetworks();
    		}
    	}
    }      
        
    最新技术文章:
    ▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
    ▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
    ▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
    ▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
    ▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
    ▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
    ▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
    ▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
    ▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
    ▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
    ▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
    ▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
    ▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
    ▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
    ▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
    ▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
    ▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
    ▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
    ▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
    ▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
    ▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一) iis7站长之家
    ▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
    ▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
    ▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
    ▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
    ▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
    ▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
    ▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
    ▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
    ▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
     


    站内导航:


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

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

    浙ICP备11055608号-3