最近网友问晚上失眠的问题
最近网友问晚上失眠的问题,俺记起了一个回答:在晚上睡觉时常常失眠——这是文化人典型的毛病。
如果你对上面的结果感兴趣,俺可以告诉你 这是在一台2000元左右的i3的pc机上运行的。
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace TextUtils
{public class TextFinder{public List<FinderItem> Items = new List<FinderItem>();public void InitFinder(string txt){Items.Clear();string[] ss = txt.Split(new string[] { " ", " ", ",", ",", ".", "。", ";", ";", ";", @"\", "、", "|", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);int c = ss.Length;for (int i = 0; i < c; i++){string s = ss[i];FinderItem item = new FinderItem();item.txt = s.ToArray();item.weight = item.txt.Length * item.txt.Length + (c - i);Items.Add(item);}}public FinderResult FindInBook(BookFile book){FinderResult r = new FinderResult();r.finder = this;int min_w = 1;int w = 0;foreach (FinderItem item in Items)w = w + item.weight;if (w > 2){min_w = (int)Math.Sqrt(w);}bool b = true; int weight = 0;for (int idx = 0; idx < book.Contents.Count; idx++){weight = 0;foreach (FinderItem item in Items){if (item.txt.Length == 1){if (BinFind(book.Contents[idx].SortedChar, item.txt[0]) >= 0)weight = weight + item.weight;}else{b = true;foreach (char ch in item.txt){if (BinFind(book.Contents[idx].SortedChar, ch) < 0){b = false;break;}}if (b){if (ArrayFind(book.Contents[idx].Content, item.txt)>=0)weight = weight + item.weight;}}}if (weight >= min_w){ResultItem ri = new ResultItem();ri.book_id = book.id;ri.content_idx = idx;ri.weight = weight;r.items.Add(ri);}}return r;}public int IsKey(char[] source, int idx){int result = 0;bool b = true;foreach (FinderItem item in Items){if (item.txt.Length == 1){if (source[idx] == item.txt[0])if (result < 1)result = 1;}else{if (idx + item.txt.Length <= source.Length){char ch0 = item.txt[0];if (source[idx] == ch0){b = true;for (int k = 1; k < item.txt.Length; k++){if (source[idx + k] != item.txt[k]){b = false;break;}}if (b){if (item.txt.Length > result)result = item.txt.Length; }}}}}return result;}public static int ArrayFind(char[] source, char[] target){bool b = true;int target_len = target.Length;char ch0 = target[0];for (int i = 0; i < source.Length - target.Length; i++){if (source[i] == ch0){b = true;for (int k = 1; k < target_len; k++){if (source[i + k] != target[k]){b = false;break;}}if (b)return i;}}return -1;}public static int BinFind(char[] source, char target){if (source.Length < 5){for (int i=0;i< source.Length;i++){if (source[i] == target)return i; }return -1;}//数组左边界索引值int left = 0;//数组的右边界索引值int right = source.Length - 1;//数组的中位值的索引值int mid = 0;//在循环中,根据中位值与目标值对比,更新左(右)边界的值,从而缩小检索范围,直到找到目标值。while (left <= right){ //每循环一次,中位值索引也要随着左(右)边界的改变而改变mid = (left + right) / 2;if (source[mid].Equals(target)){return mid;} //中位值在目标值左边时更新左边界索引else if (source[mid] < target){left = mid + 1;} //中位值在目标值右边时更新右边界索引else if (source[mid] > target){right = mid - 1;}}return -1;}}public class FinderItem{public char[] txt;public int weight;}public class FinderResult{public TextFinder finder;public List<ResultItem> items = new List<ResultItem>();public void SortItems(){items.Sort(new SortResultItem());}}public class ResultItem{public int weight;public int book_id;public int content_idx;}public class SortResultItem : Comparer<ResultItem>{public override int Compare(ResultItem x, ResultItem y){return y.weight.CompareTo(x.weight);}}
}