亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? engine.cs

?? A Generic, Reusable Diff Algorithm in C# 這是一個用C#實現(xiàn)的Diff程序
?? CS
字號:
using System;
using System.Collections;

namespace DifferenceEngine
{
	public enum DiffEngineLevel
	{
		FastImperfect,
		Medium,
		SlowPerfect
	}

	public class DiffEngine
	{
		private IDiffList _source;
		private IDiffList _dest;
		private ArrayList _matchList;

		private DiffEngineLevel _level;

		private DiffStateList _stateList;

		public DiffEngine() 
		{
			_source = null;
			_dest = null;
			_matchList = null;
			_stateList = null;
			_level = DiffEngineLevel.FastImperfect;
		}

		private int GetSourceMatchLength(int destIndex, int sourceIndex, int maxLength)
		{
			int matchCount;
			for (matchCount = 0; matchCount < maxLength; matchCount++)
			{
				if ( _dest.GetByIndex(destIndex + matchCount).CompareTo(_source.GetByIndex(sourceIndex + matchCount)) != 0 )
				{
					break;
				}
			}
			return matchCount;
		}

		private void GetLongestSourceMatch(DiffState curItem, int destIndex,int destEnd, int sourceStart,int sourceEnd)
		{
			
			int maxDestLength = (destEnd - destIndex) + 1;
			int curLength = 0;
			int curBestLength = 0;
			int curBestIndex = -1;
			int maxLength = 0;
			for (int sourceIndex = sourceStart; sourceIndex <= sourceEnd; sourceIndex++)
			{
				maxLength = Math.Min(maxDestLength,(sourceEnd - sourceIndex) + 1);
				if (maxLength <= curBestLength)
				{
					//No chance to find a longer one any more
					break;
				}
				curLength = GetSourceMatchLength(destIndex,sourceIndex,maxLength);
				if (curLength > curBestLength)
				{
					//This is the best match so far
					curBestIndex = sourceIndex;
					curBestLength = curLength;
				}
				//jump over the match
				sourceIndex += curBestLength; 
			}
			//DiffState cur = _stateList.GetByIndex(destIndex);
			if (curBestIndex == -1)
			{
				curItem.SetNoMatch();
			}
			else
			{
				curItem.SetMatch(curBestIndex, curBestLength);
			}
		
		}

		private void ProcessRange(int destStart, int destEnd, int sourceStart, int sourceEnd)
		{
			int curBestIndex = -1;
			int curBestLength = -1;
			int maxPossibleDestLength = 0;
			DiffState curItem = null;
			DiffState bestItem = null;
			for (int destIndex = destStart; destIndex <= destEnd; destIndex++)
			{
				maxPossibleDestLength = (destEnd - destIndex) + 1;
				if (maxPossibleDestLength <= curBestLength)
				{
					//we won't find a longer one even if we looked
					break;
				}
				curItem = _stateList.GetByIndex(destIndex);
				
				if (!curItem.HasValidLength(sourceStart, sourceEnd, maxPossibleDestLength))
				{
					//recalc new best length since it isn't valid or has never been done.
					GetLongestSourceMatch(curItem, destIndex, destEnd, sourceStart, sourceEnd);
				}
				if (curItem.Status == DiffStatus.Matched)
				{
					switch (_level)
					{
						case DiffEngineLevel.FastImperfect:
							if (curItem.Length > curBestLength)
							{
								//this is longest match so far
								curBestIndex = destIndex;
								curBestLength = curItem.Length;
								bestItem = curItem;
							}
							//Jump over the match 
							destIndex += curItem.Length - 1; 
							break;
						case DiffEngineLevel.Medium: 
							if (curItem.Length > curBestLength)
							{
								//this is longest match so far
								curBestIndex = destIndex;
								curBestLength = curItem.Length;
								bestItem = curItem;
								//Jump over the match 
								destIndex += curItem.Length - 1; 
							}
							break;
						default:
							if (curItem.Length > curBestLength)
							{
								//this is longest match so far
								curBestIndex = destIndex;
								curBestLength = curItem.Length;
								bestItem = curItem;
							}
							break;
					}
				}
			}
			if (curBestIndex < 0)
			{
				//we are done - there are no matches in this span
			}
			else
			{
	
				int sourceIndex = bestItem.StartIndex;
				_matchList.Add(DiffResultSpan.CreateNoChange(curBestIndex,sourceIndex,curBestLength));
				if (destStart < curBestIndex)
				{
					//Still have more lower destination data
					if (sourceStart < sourceIndex)
					{
						//Still have more lower source data
						// Recursive call to process lower indexes
						ProcessRange(destStart, curBestIndex -1,sourceStart, sourceIndex -1);
					}
				}
				int upperDestStart = curBestIndex + curBestLength;
				int upperSourceStart = sourceIndex + curBestLength;
				if (destEnd > upperDestStart)
				{
					//we still have more upper dest data
					if (sourceEnd > upperSourceStart)
					{
						//set still have more upper source data
						// Recursive call to process upper indexes
						ProcessRange(upperDestStart,destEnd,upperSourceStart,sourceEnd);
					}
				}
			}
		}

		public double ProcessDiff(IDiffList source, IDiffList destination,DiffEngineLevel level)
		{
			_level = level;
			return ProcessDiff(source,destination);
		}

		public double ProcessDiff(IDiffList source, IDiffList destination)
		{
			DateTime dt = DateTime.Now;
			_source = source;
			_dest = destination;
			_matchList = new ArrayList();
			
			int dcount = _dest.Count();
			int scount = _source.Count();
			
			
			if ((dcount > 0)&&(scount > 0))
			{
				_stateList = new DiffStateList(dcount);
				ProcessRange(0,dcount - 1,0, scount - 1);
			}

			TimeSpan ts = DateTime.Now - dt;
			return ts.TotalSeconds;
		}


		private bool AddChanges(
			ArrayList report, 
			int curDest,
			int nextDest,
			int curSource,
			int nextSource)
		{
			bool retval = false;
			int diffDest = nextDest - curDest;
			int diffSource = nextSource - curSource;
			int minDiff = 0;
			if (diffDest > 0)
			{
				if (diffSource > 0)
				{
					minDiff = Math.Min(diffDest,diffSource);
					report.Add(DiffResultSpan.CreateReplace(curDest,curSource,minDiff));
					if (diffDest > diffSource)
					{
						curDest+=minDiff;
						report.Add(DiffResultSpan.CreateAddDestination(curDest,diffDest - diffSource)); 
					}
					else
					{
						if (diffSource > diffDest)
						{
							curSource+= minDiff;
							report.Add(DiffResultSpan.CreateDeleteSource(curSource,diffSource - diffDest));
						}
					}	
				}
				else
				{
					report.Add(DiffResultSpan.CreateAddDestination(curDest,diffDest)); 
				}
				retval = true;
			}
			else
			{
				if (diffSource > 0)
				{
					report.Add(DiffResultSpan.CreateDeleteSource(curSource,diffSource));  
					retval = true;
				}
			}
			return retval;
		}

		public ArrayList DiffReport()
		{
			ArrayList retval = new ArrayList();
			int dcount = _dest.Count();
			int scount = _source.Count();
			
			//Deal with the special case of empty files
			if (dcount == 0)
			{
				if (scount > 0)
				{
					retval.Add(DiffResultSpan.CreateDeleteSource(0,scount));
				}
				return retval;
			}
			else
			{
				if (scount == 0)
				{
					retval.Add(DiffResultSpan.CreateAddDestination(0,dcount));
					return retval;
				}
			}


			_matchList.Sort();
			int curDest = 0;
			int curSource = 0;
			DiffResultSpan last = null;

			//Process each match record
			foreach (DiffResultSpan drs in _matchList)
			{
				if ((!AddChanges(retval,curDest,drs.DestIndex,curSource,drs.SourceIndex))&&
					(last != null))
				{
					last.AddLength(drs.Length);
				}
				else
				{
					retval.Add(drs);
				}
				curDest = drs.DestIndex + drs.Length;
				curSource = drs.SourceIndex + drs.Length;
				last = drs;
			}
			
			//Process any tail end data
			AddChanges(retval,curDest,dcount,curSource,scount);

			return retval;
		}
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色哟哟国产精品免费观看| 卡一卡二国产精品| 亚洲欧美电影院| 亚洲麻豆国产自偷在线| 国产精品国产三级国产普通话蜜臀| 日韩欧美在线123| 亚洲精品一区二区三区香蕉| 欧美xfplay| 国产精品私人影院| 亚洲尤物视频在线| 婷婷久久综合九色综合绿巨人| 亚洲日本护士毛茸茸| 婷婷开心激情综合| 美女精品一区二区| 岛国av在线一区| 91免费观看在线| 91精品黄色片免费大全| 久久久无码精品亚洲日韩按摩| 国产精品每日更新在线播放网址| 亚洲特级片在线| 亚洲图片一区二区| 国产一区免费电影| 欧美手机在线视频| 国产精品污污网站在线观看| 亚洲免费在线观看视频| 久久国产尿小便嘘嘘| 91亚洲精华国产精华精华液| 欧美一卡2卡3卡4卡| 自拍偷拍亚洲激情| 高清成人在线观看| 欧美一区二区日韩| 亚洲欧美偷拍三级| 99综合电影在线视频| 精品理论电影在线观看| 日韩高清不卡一区二区三区| caoporn国产精品| 国产亚洲短视频| 国产一区不卡视频| 2021中文字幕一区亚洲| 蜜臀av性久久久久蜜臀aⅴ四虎| 色婷婷久久久久swag精品| 国产亚洲短视频| 国产一区在线精品| 国产三级精品在线| 国产a级毛片一区| 亚洲欧洲精品天堂一级| 成人三级伦理片| 亚洲精品国产无套在线观| 91精品福利在线| 午夜精品福利在线| 精品国产百合女同互慰| 国产成人免费xxxxxxxx| 最近日韩中文字幕| 一本高清dvd不卡在线观看| 亚洲风情在线资源站| 欧美精品高清视频| 国产一区二区三区在线观看免费 | 国产精品福利电影一区二区三区四区 | 亚洲成人综合视频| 色8久久人人97超碰香蕉987| 国产日韩欧美激情| 亚洲国产成人av好男人在线观看| 在线视频亚洲一区| 在线亚洲精品福利网址导航| 中文字幕一区二区三中文字幕| 中文字幕av在线一区二区三区| 麻豆精品视频在线观看视频| 日韩色在线观看| 激情成人综合网| 3d动漫精品啪啪1区2区免费| 国产午夜精品美女毛片视频| 久久免费视频色| 99精品久久只有精品| 成人综合在线网站| 国产精品电影院| 久久综合色一综合色88| 国产亚洲人成网站| 欧美韩日一区二区三区| 日韩一区二区三区免费观看| 日韩精品一区二区在线| 欧美国产乱子伦| 精品国产一区二区三区不卡| 国产亚洲1区2区3区| 久久爱www久久做| 日本欧美韩国一区三区| www.亚洲色图.com| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲综合在线免费观看| 91精品国产丝袜白色高跟鞋| 在线观看欧美精品| 91在线视频官网| 成人免费视频视频| 国产成人午夜精品影院观看视频| 欧美一区二区性放荡片| 国产精品一线二线三线| 一色屋精品亚洲香蕉网站| 成人app在线观看| 亚洲男人天堂av| 国产一区在线观看麻豆| 国产盗摄一区二区三区| 色一区在线观看| 欧美午夜理伦三级在线观看| av在线播放不卡| 免费精品视频在线| 精品盗摄一区二区三区| 欧美精品v国产精品v日韩精品| 亚洲精品网站在线观看| 一区二区三区中文字幕电影 | 亚洲人吸女人奶水| 蜜臀av性久久久久av蜜臀妖精| 成人免费视频播放| 日韩精品1区2区3区| 精品伊人久久久久7777人| 欧美三级中文字| 日韩精品在线看片z| 久久精品国产精品青草| 国产成人在线网站| 欧美大胆人体bbbb| www欧美成人18+| 成人网在线免费视频| 欧美乱妇20p| 91麻豆精品国产91久久久资源速度| 成人免费观看男女羞羞视频| 久久久高清一区二区三区| 欧美一区二区三区四区在线观看 | 91最新地址在线播放| 日本精品视频一区二区| 久久久国产一区二区三区四区小说 | 成人黄色免费短视频| 国产一区美女在线| 91热门视频在线观看| 日韩精品乱码av一区二区| 91影院在线免费观看| 国产不卡视频在线播放| 亚欧色一区w666天堂| 亚洲桃色在线一区| 欧美日韩一二三| 毛片av一区二区| 自拍偷拍国产亚洲| 午夜精品久久久久久久久久| 亚洲国产成人自拍| 日日夜夜精品视频天天综合网| 26uuu另类欧美| 尤物av一区二区| 欧美国产综合色视频| 日韩欧美综合一区| 精品日韩99亚洲| 亚洲成人精品在线观看| 国产成人福利片| 7777女厕盗摄久久久| 91麻豆视频网站| 一区二区三区日韩欧美| 国产乱人伦偷精品视频不卡| 欧美自拍偷拍午夜视频| 国产精品麻豆久久久| 免费高清在线视频一区·| 色综合一个色综合| 1024亚洲合集| 国产伦理精品不卡| 久久影院电视剧免费观看| 成人伦理片在线| 香蕉乱码成人久久天堂爱免费| 国产亚洲1区2区3区| 国模一区二区三区白浆| 欧美三级视频在线| 自拍偷拍亚洲欧美日韩| 国产原创一区二区| 欧美日韩在线播放| 亚洲成av人片一区二区梦乃| 99麻豆久久久国产精品免费| 久久新电视剧免费观看| 日本不卡视频在线观看| 3atv在线一区二区三区| 亚洲国产精品人人做人人爽| 8x福利精品第一导航| 亚洲欧美一区二区在线观看| 成人午夜av影视| 久久久www成人免费毛片麻豆 | 中文字幕字幕中文在线中不卡视频| 国产成人综合自拍| 久久精品无码一区二区三区| 国产一区二区网址| 精品久久久久香蕉网| 国产精品白丝jk黑袜喷水| 久久久久久久综合日本| 精品亚洲欧美一区| 欧美成人福利视频| 国产91精品一区二区麻豆亚洲| 久久久久99精品一区| 国产综合一区二区| 久久久久久久久久久99999| 成人性视频网站| 国产精品美女久久久久久久网站| 国产69精品久久久久毛片| 久久久国产综合精品女国产盗摄| 99在线精品免费| 亚洲综合一二三区| 欧美日韩精品一区视频| 日本不卡视频一二三区| 国产人伦精品一区二区|