/// <summary> /// 获取指定组合数量中最有价值的组合 /// </summary> /// <param name="bytes">查询数据</param> /// <param name="groupSize">组合大小</param> /// <returns>最有价值的组合</returns> public static CompressItem GetCompressItem(byte[] bytes, int groupSize) { var endIndex = bytes.Length - groupSize; //得到结束位索引 var compressItemDic = new Dictionary <CompressItem, int>(); //判断是否存在 for (int i = 0; i <= endIndex; i++) { var group = ByteGroup.Create(bytes, i, groupSize); //得到Group var item = new CompressItem { Group = group, Bytes = bytes, StartIndex = i }; if (compressItemDic.ContainsKey(item)) { compressItemDic[item]++; } else { compressItemDic[item] = 1; } } var items = compressItemDic.OrderByDescending(b => b.Value).ThenByDescending(b => b.Key.StartIndex) .ToArray(); //得到理论上最多组合数排序的结果 var maxItem = items.First().Key; //得到第一个理论上最多组合结果 maxItem.Count = GetCompressGroup(bytes, maxItem.Group, maxItem.StartIndex); //得到理论上第一个的实际可用组合数 for (var i = 1; i < items.Length; i++) { var item = items[i]; if (item.Value <= maxItem.Count) { break; //如果理论组合数还小于等于目前最多的实际组合数就没有必要继续搜索下去了 } item.Key.Count = GetCompressGroup(bytes, item.Key.Group, item.Key.StartIndex); //得到实际组合数量 //判断是否实际组合数量大于现在最多的 if (item.Key.Count > maxItem.Count) { maxItem = item.Key;//赋值目前为最多实际组合结果 } } return(maxItem); }
/// <summary> /// 验证可压缩组合个数 /// </summary> /// <param name="bytes">查询数据</param> /// <param name="group">组合对象</param> /// <returns>组合数量</returns> private static int GetCompressGroup(byte[] bytes, ByteGroup group, int start) { var groupSize = group.Bytes.Length; var endIndex = bytes.Length - groupSize; //得到结束位索引 var count = 0; for (var i = start; i <= endIndex;) { if (group.EqArray(bytes, i)) { count++; i += groupSize; } else { i++; } } return(count); }