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

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

?? multidimension.java

?? 非常棒的java數據庫
?? JAVA
字號:
/*
 * Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
 * (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package org.h2.tools;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import org.h2.util.StringUtils;

/**
 * A tool to help an application execute multi-dimensional range queries.
 * The algorithm used is database independent, the only requirement
 * is that the engine supports a range index (for example b-tree).
 */
public class MultiDimension {

    private static MultiDimension instance = new MultiDimension();

    private MultiDimension() {
    }

    /**
     * Get the singleton.
     *
     * @return the singleton
     */
    public static MultiDimension getInstance() {
        return instance;
    }

    /**
     * Convert the multi-dimensional value into a one-dimensional (scalar) value.
     * This is done by interleaving the bits of the values.
     * Each values must be bigger or equal to 0. The maximum value
     * is dependent on the number of dimensions. For two keys, it is 32 bit,
     * for 3: 21 bit, 4: 16 bit, 5: 12 bit, 6: 10 bit, 7: 9 bit, 8: 8 bit.
     *
     * @param values the multi-dimensional value
     * @return the scalar value
     */
    public long interleave(int[] values) {
        int dimensions = values.length;
        int bitsPerValue = 64 / dimensions;
        // for 2 keys: 0x800000; 3: 0x
        long max = 1L << bitsPerValue;
        long x = 0;
        for (int i = 0; i < dimensions; i++) {
            long k = values[i];
            if (k < 0 || k > max) {
                throw new Error("value out of range; value=" + values[i] + " min=0 max=" + max);
            }
            for (int b = 0; b < bitsPerValue; b++) {
                x |= (k & (1L << b)) << (i + (dimensions - 1) * b);
            }
        }
        if (dimensions == 2) {
            long xx = getMorton2(values[0], values[1]);
            if (xx != x) {
                throw new Error("test");
            }
        }
        return x;
    }

    /**
     * Gets one of the original multi-dimensional values from a scalar value.
     *
     * @param scalar the scalar value
     * @param dimensions the number of dimensions
     * @param dim the dimension of the returned value (starting from 0)
     * @return the value
     */
    public int deinterleave(long scalar, int dimensions, int dim) {
        int bitsPerValue = 64 / dimensions;
        int value = 0;
        for (int i = 0; i < bitsPerValue; i++) {
            value |= (scalar >> (dim + (dimensions - 1) * i)) & (1L << i);
        }
        return value;
    }


//    public static int get(long z, int d) {
//        int n = 0;
//        for (int i = 0; i < 31; i++) {
//            n |= (z & (1 << (i + i + d))) >> (i + d);
//        }
//        return n;
//    }

    /**
     * Generates an optimized multi-dimensional range query.
     * The query contains parameters. It can only be used with the H2 database.
     *
     * @param table the table name
     * @param columns the list of columns
     * @param scalarColumn the column name of the computed scalar column
     * @return the query
     */
    public String generatePreparedQuery(String table, String scalarColumn, String[] columns) {
        StringBuffer buff = new StringBuffer("SELECT D.* FROM ");
        buff.append(StringUtils.quoteIdentifier(table));
        buff.append(" D, TABLE(_FROM_ BIGINT=?, _TO_ BIGINT=?) WHERE ");
        buff.append(StringUtils.quoteIdentifier(scalarColumn));
        buff.append(" BETWEEN _FROM_ AND _TO_");
        for (int i = 0; i < columns.length; i++) {
            buff.append(" AND ");
            buff.append(StringUtils.quoteIdentifier(columns[i]));
            buff.append("+1 BETWEEN ?+1 AND ?+1");
        }
        return buff.toString();
    }
    
    /**
     * Executes a prepared query that was generated using generatePreparedQuery.
     * 
     * @param prep the prepared statement
     * @param min the lower values
     * @param max the upper values
     * @return the result set
     */
    public ResultSet getResult(PreparedStatement prep, int[] min, int[] max) throws SQLException {
        long[][] ranges = getMortonRanges(min, max);
        int len = ranges.length;
        Long[] from = new Long[len];
        Long[] to = new Long[len];
        for (int i = 0; i < len; i++) {
            from[i] = new Long(ranges[i][0]);
            to[i] = new Long(ranges[i][1]);
        }
        prep.setObject(1, from);
        prep.setObject(2, to);
        len = min.length;
        for (int i = 0, idx = 3; i < len; i++) {
            prep.setInt(idx++, min[i]);
            prep.setInt(idx++, max[i]);
        }
        return prep.executeQuery();
    }

    /**
     * Generates an optimized multi-dimensional range query.
     * This query is database independent, however the performance is
     * not as good as when using generatePreparedQuery
     *
     * @param table the table name
     * @param columns the list of columns
     * @param min the lower values
     * @param max the upper values
     * @param scalarColumn the column name of the computed scalar column
     * @return the query
     */
    public String generateQuery(String table, String scalarColumn, String[] columns, int[] min, int[] max) {
        long[][] ranges = getMortonRanges(min, max);
        StringBuffer buff = new StringBuffer("SELECT * FROM (");
        for (int i = 0; i < ranges.length; i++) {
            if (i > 0) {
                buff.append(" UNION ALL ");
            }
            long minScalar = ranges[i][0];
            long maxScalar = ranges[i][1];
            buff.append("SELECT * FROM ").append(table).append(" WHERE ");
            buff.append(scalarColumn).append(" BETWEEN ");
            buff.append(minScalar).append(" AND ").append(maxScalar);
        }
        buff.append(") WHERE ");
        for (int j = 0; j < columns.length; j++) {
            if (j > 0) {
                buff.append(" AND ");
            }
            buff.append(columns[j]).append(" BETWEEN ");
            buff.append(min[j]).append(" AND ").append(max[j]);
        }
        return buff.toString();
    }

    /**
     * Gets a list of ranges to be searched for a multi-dimensional range query
     * where min &lt;= value &lt;= max. In most cases, the ranges will be larger
     * than required in order to combine smaller ranges into one. Usually, about
     * double as much points will be included in the resulting range.
     *
     * @param min the minimum value
     * @param max the maximum value
     * @return the list of ranges
     */
    public long[][] getMortonRanges(int[] min, int[] max) {
        int len = min.length;
        if (max.length != len) {
            throw new Error("dimensions mismatch");
        }
        for (int i = 0; i < len; i++) {
            if (min[i] > max[i]) {
                int temp = min[i];
                min[i] = max[i];
                max[i] = temp;
            }
        }
        int total = getSize(min, max, len);
        ArrayList list = new ArrayList();
        addMortonRanges(list, min, max, len, 0);
        optimize(list, total);
        long[][] ranges = new long[list.size()][2];
        list.toArray(ranges);
        return ranges;
    }

    private long getMorton2(int x, int y) {
        long z = 0;
        for (int i = 0; i < 32; i++) {
            z |= (x & (1L << i)) << (i);
            z |= (y & (1L << i)) << (i + 1);
        }
        return z;
    }

    private int getSize(int[] min, int[] max, int len) {
        int size = 1;
        for (int i = 0; i < len; i++) {
            int diff = max[i] - min[i];
            size *= (diff + 1);
        }
        return size;
    }

    private void optimize(ArrayList list, int total) {
        Collections.sort(list, new Comparator() {
            public int compare(Object a, Object b) {
                long[] la = (long[]) a;
                long[] lb = (long[]) b;
                return la[0] > lb[0] ? 1 : -1;
            }
        });
        int minGap = 10;
        for (;; minGap += (minGap / 2)) {
            for (int i = 0; i < list.size() - 1; i++) {
                long[] current = (long[]) list.get(i);
                long[] next = (long[]) list.get(i + 1);
                if (current[1] + minGap >= next[0]) {
                    current[1] = next[1];
                    list.remove(i + 1);
                    i--;
                }
            }
            int searched = 0;
            for (int j = 0; j < list.size(); j++) {
                long[] range = (long[]) list.get(j);
                searched += range[1] - range[0] + 1;
            }
            if (searched > 2 * total || list.size() < 3 /* || minGap > total */) {
                break;
            }
        }
    }

    private void addMortonRanges(ArrayList list, int[] min, int[] max, int len, int level) {
        if (level > 100) {
            throw new Error("Stop");
        }
        int largest = 0, largestDiff = 0;
        long size = 1;
        for (int i = 0; i < len; i++) {
            int diff = max[i] - min[i];
            if (diff < 0) {
                throw new Error("Stop");
            }
            size *= (diff + 1);
            if (size < 0) {
                throw new Error("Stop");
            }
            if (diff > largestDiff) {
                largestDiff = diff;
                largest = i;
            }
        }
        long low = interleave(min), high = interleave(max);
        if (high < low) {
            throw new Error("Stop");
        }
        long range = high - low + 1;
        if (range == size) {
            long[] item = new long[] { low, high };
            list.add(item);
        } else {
            int middle = findMiddle(min[largest], max[largest]);
            int temp = max[largest];
            max[largest] = middle;
            addMortonRanges(list, min, max, len, level + 1);
            max[largest] = temp;
            temp = min[largest];
            min[largest] = middle + 1;
            addMortonRanges(list, min, max, len, level + 1);
            min[largest] = temp;
        }
    }

    private int roundUp(int x, int blockSizePowerOf2) {
        return (x + blockSizePowerOf2 - 1) & (-blockSizePowerOf2);
    }

    private int findMiddle(int a, int b) {
        int diff = b - a - 1;
        if (diff == 0) {
            return a;
        }
        if (diff == 1) {
            return a + 1;
        }
        int scale = 0;
        while ((1 << scale) < diff) {
            scale++;
        }
        scale--;
        int m = roundUp(a + 2, 1 << scale) - 1;
        if (m <= a || m >= b) {
            throw new Error("stop");
        }
        return m;
    }

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美韩国日本综合| 欧美美女直播网站| 欧美在线免费视屏| 欧美一区二区成人| 1024亚洲合集| 国产一区 二区| 欧美性xxxxx极品少妇| 欧美zozozo| 亚洲第一主播视频| 成人视屏免费看| 日韩欧美国产午夜精品| 一区二区三区资源| 国产成人亚洲综合a∨婷婷| 欧美三级视频在线| 欧美经典一区二区| 久久99精品久久久久久| 欧美在线观看禁18| 中文字幕在线不卡一区| 激情综合亚洲精品| 欧美日韩国产首页在线观看| 中文字幕一区二区三区色视频| 美国十次了思思久久精品导航| 99国产精品99久久久久久| 久久综合色综合88| 日本少妇一区二区| 欧美日韩高清一区二区三区| 一区视频在线播放| 成人a免费在线看| 精品成人佐山爱一区二区| 无码av免费一区二区三区试看| 99精品久久久久久| 中文字幕中文字幕在线一区| 国产精品影视在线| 欧美精品一区视频| 激情另类小说区图片区视频区| 欧美一级免费大片| 日本欧美肥老太交大片| 欧美日产在线观看| 偷拍一区二区三区| 日韩一区二区不卡| 麻豆一区二区99久久久久| 91精品国产色综合久久不卡电影| 天天影视涩香欲综合网| 欧美精品久久一区| 蜜臀av一区二区在线免费观看| 欧美丰满美乳xxx高潮www| 视频一区中文字幕国产| 欧美一区二区在线免费观看| 免费高清成人在线| 久久免费美女视频| 成人一道本在线| 亚洲人快播电影网| 欧美日韩国产免费一区二区| 视频一区二区三区中文字幕| 日韩精品一区二区三区视频播放| 精品在线播放免费| 国产欧美精品一区二区三区四区| 成人av集中营| 亚洲一区二区三区爽爽爽爽爽| 欧美日韩中字一区| 久久精品国产久精国产爱| 国产亚洲欧洲一区高清在线观看| 国产成人综合视频| 亚洲免费观看高清完整版在线观看| 欧美视频在线观看一区二区| 青青草精品视频| 日本一区二区三级电影在线观看| 成人h精品动漫一区二区三区| 夜夜爽夜夜爽精品视频| 日韩欧美一级在线播放| 丰满白嫩尤物一区二区| 亚洲伦理在线免费看| 欧美一区二区三区在线看| 国产精品亚洲а∨天堂免在线| 亚洲桃色在线一区| 日韩免费一区二区三区在线播放| 国产不卡视频在线观看| 亚洲高清视频在线| 国产欧美日韩激情| 欧美精品xxxxbbbb| 成人网男人的天堂| 青青草97国产精品免费观看| 国产精品卡一卡二| 日韩免费在线观看| 色美美综合视频| 国产精品一区二区免费不卡| 一区二区三区.www| 国产婷婷色一区二区三区四区| 精品视频一区二区不卡| 国产成人aaa| 裸体一区二区三区| 一区二区视频在线看| 国产欧美精品一区二区三区四区| 欧美巨大另类极品videosbest| 波多野结衣亚洲一区| 麻豆久久一区二区| www.一区二区| 久久国产欧美日韩精品| 亚洲成a人片在线观看中文| 欧美激情一区在线观看| 欧美大片一区二区| 欧美美女bb生活片| 色哟哟精品一区| 成人黄色大片在线观看| 国内外成人在线| 日韩二区三区四区| 亚洲成av人片www| 亚洲一区二区四区蜜桃| 国产精品三级久久久久三级| 久久网站热最新地址| 日韩精品一区二区在线| 欧美日韩中文另类| 在线视频国内一区二区| gogogo免费视频观看亚洲一| 韩国av一区二区三区| 麻豆国产一区二区| 麻豆91免费观看| 精品一二线国产| 久久99精品久久久| 蜜臀久久99精品久久久久宅男 | 一区二区三区四区亚洲| 国产日韩欧美亚洲| 欧美国产一区在线| 日本一区二区电影| 亚洲国产精品国自产拍av| 国产日韩欧美电影| 国产精品视频看| 亚洲女性喷水在线观看一区| 最好看的中文字幕久久| 一区二区三区小说| 爽好久久久欧美精品| 视频在线观看一区二区三区| 天天亚洲美女在线视频| 天天色综合天天| 亚洲免费观看高清完整| 亚洲人精品一区| 自拍偷拍亚洲综合| 国产精品你懂的在线| 中文字幕视频一区二区三区久| 中文字幕av在线一区二区三区| 国产欧美日韩激情| 国产精品理伦片| 国产精品狼人久久影院观看方式| 国产精品久久免费看| 中文字幕乱码亚洲精品一区| 中文字幕不卡在线| 国产精品伦理一区二区| 亚洲国产日韩综合久久精品| 午夜精品久久久久| 日本成人在线不卡视频| 麻豆91精品91久久久的内涵| 看电视剧不卡顿的网站| 成人激情文学综合网| 91美女福利视频| 欧美日韩国产一区二区三区地区| 欧美电影在线免费观看| 久久久久99精品一区| 国产精品久久久久久久久免费樱桃 | 欧美视频一区二区三区四区| 欧美性猛交xxxx黑人交| 久久综合给合久久狠狠狠97色69| 国产亚洲1区2区3区| 亚洲欧洲三级电影| 亚洲国产精品久久久久秋霞影院 | 亚洲成人免费在线观看| 美腿丝袜在线亚洲一区 | 亚洲黄色在线视频| 国产精品理伦片| 精品制服美女丁香| 成人激情开心网| 欧美色国产精品| 久久人人爽爽爽人久久久| 午夜精品久久久久久久久久久| 日本欧美一区二区三区乱码| 国产在线播放一区二区三区| 成人h精品动漫一区二区三区| 国产**成人网毛片九色| 欧美一区二区啪啪| 国产精品区一区二区三| 99精品国产一区二区三区不卡| 欧美日韩一区三区四区| 亚洲天堂免费看| 精品中文字幕一区二区小辣椒| 91免费小视频| 精品成人a区在线观看| 亚洲一区二区精品久久av| 国产一区二区日韩精品| 欧美优质美女网站| 国产亚洲短视频| 亚洲午夜在线视频| www.亚洲色图.com| 欧美成人官网二区| 亚洲在线成人精品| 国产成人精品一区二| xvideos.蜜桃一区二区| 亚洲综合网站在线观看| 福利视频网站一区二区三区| 欧美一级日韩不卡播放免费| 青青国产91久久久久久| 欧美日韩一区三区四区|