tomcat_3 2008-11-25 22:05
浏览 624
已采纳

从byte[]超大数组搜索指定某段子byte[]数组的问题

问题如题,byte[]超大数组包含若干个数据项,每个数据项开头4个字节是日期(yyyymmdd),我现在根据指定搜索条件(同样是yyyymmdd)去byte[]超大数组搜索有没有数据项开头4个字节是日期(yyyymmdd)值小于指定搜索条件值的,若成立,因为每个数据项byte[]长度固定,因此我就可解析出对应数据项数据,现在问题是,Arrays提供的二分查找需要使用前对数组排序,那样的话对我这个由特定顺序而又不能改变顺序的byte[]是不适合的,因此求一算法实现对我前述问题一种高速搜索算法
[b]问题补充:[/b]
由于具体协议决定了byte[]的byte顺序不能打乱,不然对整个数据含义就发生了变化,因此不能进行排序搜索,我们目前采用的方式如下:
[code="java"]
private byte[] queryForList(String cacheName, HkStocQuot obj, String type){
//获取缓存对象
Cache c = InfoCacheMS.getInstance().getCache(cacheName);
//获取大数组
byte[] quote = (byte[]) (c.get(type).getObjectValue());
//循环步长为44----每个数据项含44个byte
for (int j = 0; j < quote.length; j += 44) {
//ConversionUtil.byte2int()方法用于获取每个数据项前4个byte,这4个字节就是每个数据项携带的日期字段值;obj.getTradeDate()为客户端提交的交易时间查询条件
if (new BigDecimal(ConversionUtil.byte2int(quote,j) + "").compareTo(obj.getTradeDate()) < 0) {
//do something。。。
}
}
}
[/code]
但我感觉这个实现性能不是很高,因为现在是一个是适时性要求极高的系统,因此希望各位高手踊跃给出解决方案

  • 写回答

3条回答 默认 最新

  • т 2008-11-26 16:16
    关注

    lz给出的算法的主要性能问题在于对byte[]的全遍历
    而在数据没有经过排序的情况下
    不把整个byte[]全部遍历一边,是不可能得到所有满足条件的结果的
    所以,在不对数据按照时间预先排序的情况下
    效率没有多大改善的余地

    不过有一个小问题
    不需要在循环当中作ConversionUtil.byte2int处理
    可以预先把客户端提交的交易时间查询条件用上述处理的逆处理转化为4个字节的条件
    然后在循环的时候,直接将转换后的条件与4字节的日期值进行比较
    这样,只要作一次转换就够了

    在对经过顺序排序的数据进行查找的时候,一旦发现某个点的日期值小于条件值
    那么它之前的所有数据的日期都是满足条件的,
    所以二分查找法可以避免全遍历,从而实现高效查找

    lz提到“由于具体协议决定了byte[]的byte顺序不能打乱,不然对整个数据含义就发生了变化”
    我想这与排序并不矛盾
    可以在数据项中额外添加若干字节的顺序值
    这样一来,byte[]是按照时间再排序之后,
    原本的顺序信息也不会损失

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 simulink中怎么使用solve函数?
  • ¥30 dspbuilder中使用signalcompiler时报错Error during compilation: Fitter failed,求解决办法
  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 51单片机显示器问题