克里金插值算法文件

news2024/9/25 17:08:41

由于作者时间发布的比较久,导致一些cesium api和当前版本api不同,故改之:
文件名:kriging.js

/*!
 * author: [object Object]
 * @sakitam-gis/kriging v0.1.0
 * build-time: 2019-7-6 20:41
 * LICENSE: MIT
 * (c) 2019-2019 https://github.com/sakitam-gis/kriging.js
 */
function max(source) {
    return Math.max.apply(null, source);
}
function min(source) {
    return Math.min.apply(null, source);
}
function rep(source, n) {
    let array = [];
    for (let i = 0; i < n; i++) {
        array.push(source);
    }
    return array;
}
function pip(source, x, y) {
    let i = 0;
    let j = source.length - 1;
    let c = false;
    let length = source.length;
    for (; i < length; j = i++) {
        if (((source[i][1] > y) !== (source[j][1] > y))
            && (x < (source[j][0] - source[i][0]) * (y - source[i][1]) / (source[j][1] - source[i][1]) + source[i][0])) {
            c = !c;
        }
    }
    return c;
}
function matrixDiag(c, n) {
    let i = 0;
    let Z = rep(0, n * n);
    for (; i < n; i++) {
        Z[i * n + i] = c;
    }
    return Z;
}
function matrixTranspose(X, n, m) {
    let i = 0;
    let j;
    let Z = Array(m * n);
    for (; i < n; i++) {
        j = 0;
        for (; j < m; j++) {
            Z[j * n + i] = X[i * m + j];
        }
    }
    return Z;
}
function matrixAdd(X, Y, n, m) {
    let i = 0;
    let j;
    let Z = Array(n * m);
    for (; i < n; i++) {
        j = 0;
        for (; j < m; j++) {
            Z[i * m + j] = X[i * m + j] + Y[i * m + j];
        }
    }
    return Z;
}
function matrixMultiply(X, Y, n, m, p) {
    let i = 0;
    let j;
    let k;
    let Z = Array(n * p);
    for (; i < n; i++) {
        j = 0;
        for (; j < p; j++) {
            Z[i * p + j] = 0;
            k = 0;
            for (; k < m; k++) {
                Z[i * p + j] += X[i * m + k] * Y[k * p + j];
            }
        }
    }
    return Z;
}
function matrixChol(X, n) {
    let i;
    let j;
    let k;
    let p = Array(n);
    for (i = 0; i < n; i++)
        p[i] = X[i * n + i];
    for (i = 0; i < n; i++) {
        for (j = 0; j < i; j++)
            p[i] -= X[i * n + j] * X[i * n + j];
        if (p[i] <= 0)
            return false;
        p[i] = Math.sqrt(p[i]);
        for (j = i + 1; j < n; j++) {
            for (k = 0; k < i; k++)
                X[j * n + i] -= X[j * n + k] * X[i * n + k];
            X[j * n + i] /= p[i];
        }
    }
    for (i = 0; i < n; i++)
        X[i * n + i] = p[i];
    return true;
}
function matrixChol2inv(X, n) {
    let i;
    let j;
    let k;
    let sum;
    for (i = 0; i < n; i++) {
        X[i * n + i] = 1 / X[i * n + i];
        for (j = i + 1; j < n; j++) {
            sum = 0;
            for (k = i; k < j; k++)
                sum -= X[j * n + k] * X[k * n + i];
            X[j * n + i] = sum / X[j * n + j];
        }
    }
    for (i = 0; i < n; i++)
        for (j = i + 1; j < n; j++)
            X[i * n + j] = 0;
    for (i = 0; i < n; i++) {
        X[i * n + i] *= X[i * n + i];
        for (k = i + 1; k < n; k++)
            X[i * n + i] += X[k * n + i] * X[k * n + i];
        for (j = i + 1; j < n; j++)
            for (k = j; k < n; k++)
                X[i * n + j] += X[k * n + i] * X[k * n + j];
    }
    for (i = 0; i < n; i++)
        for (j = 0; j < i; j++)
            X[i * n + j] = X[j * n + i];
}
function matrixSolve(X, n) {
    let m = n;
    let b = Array(n * n);
    let indxc = Array(n);
    let indxr = Array(n);
    let ipiv = Array(n);
    let i;
    let icol = 0;
    let irow = 0;
    let j;
    let k;
    let l;
    let ll;
    let big;
    let dum;
    let pivinv;
    let temp;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if (i === j)
                b[i * n + j] = 1;
            else
                b[i * n + j] = 0;
        }
    }
    for (j = 0; j < n; j++)
        ipiv[j] = 0;
    for (i = 0; i < n; i++) {
        big = 0;
        for (j = 0; j < n; j++) {
            if (ipiv[j] !== 1) {
                for (k = 0; k < n; k++) {
                    if (ipiv[k] === 0) {
                        if (Math.abs(X[j * n + k]) >= big) {
                            big = Math.abs(X[j * n + k]);
                            irow = j;
                            icol = k;
                        }
                    }
                }
            }
        }
        ++(ipiv[icol]);
        if (irow !== icol) {
            for (l = 0; l < n; l++) {
                temp = X[irow * n + l];
                X[irow * n + l] = X[icol * n + l];
                X[icol * n + l] = temp;
            }
            for (l = 0; l < m; l++) {
                temp = b[irow * n + l];
                b[irow * n + l] = b[icol * n + l];
                b[icol * n + l] = temp;
            }
        }
        indxr[i] = irow;
        indxc[i] = icol;
        if (X[icol * n + icol] === 0)
            return false;
        pivinv = 1 / X[icol * n + icol];
        X[icol * n + icol] = 1;
        for (l = 0; l < n; l++)
            X[icol * n + l] *= pivinv;
        for (l = 0; l < m; l++)
            b[icol * n + l] *= pivinv;
        for (ll = 0; ll < n; ll++) {
            if (ll !== icol) {
                dum = X[ll * n + icol];
                X[ll * n + icol] = 0;
                for (l = 0; l < n; l++)
                    X[ll * n + l] -= X[icol * n + l] * dum;
                for (l = 0; l < m; l++)
                    b[ll * n + l] -= b[icol * n + l] * dum;
            }
        }
    }
    for (l = (n - 1); l >= 0; l--) {
        if (indxr[l] !== indxc[l]) {
            for (k = 0; k < n; k++) {
                temp = X[k * n + indxr[l]];
                X[k * n + indxr[l]] = X[k * n + indxc[l]];
                X[k * n + indxc[l]] = temp;
            }
        }
    }
    return true;
}
function variogramGaussian(h, nugget, range, sill, A) {
    return nugget + ((sill - nugget) / range)
        * (1.0 - Math.exp(-(1.0 / A) * Math.pow(h / range, 2)));
}
function variogramExponential(h, nugget, range, sill, A) {
    return nugget + ((sill - nugget) / range)
        * (1.0 - Math.exp(-(1.0 / A) * (h / range)));
}
function variogramSpherical(h, nugget, range, sill) {
    if (h > range)
        return nugget + (sill - nugget) / range;
    return nugget + ((sill - nugget) / range)
        * (1.5 * (h / range) - 0.5 * Math.pow(h / range, 3));
}

function train(t, x, y, model, sigma2, alpha) {
    let variogram = {
        t: t,
        x: x,
        y: y,
        nugget: 0.0,
        range: 0.0,
        sill: 0.0,
        A: 1 / 3,
        n: 0,
        model: variogramExponential,
        K: [],
        M: [],
    };
    switch (model) {
        case 'gaussian':
            variogram.model = variogramGaussian;
            break;
        case 'exponential':
            variogram.model = variogramExponential;
            break;
        case 'spherical':
            variogram.model = variogramSpherical;
            break;
        default:
            variogram.model = variogramExponential;
    }
    let i;
    let j;
    let k;
    let l;
    let n = t.length;
    let distance = Array((n * n - n) / 2);
    for (i = 0, k = 0; i < n; i++) {
        for (j = 0; j < i; j++, k++) {
            distance[k] = Array(2);
            distance[k][0] = Math.pow(Math.pow(x[i] - x[j], 2)
                + Math.pow(y[i] - y[j], 2), 0.5);
            distance[k][1] = Math.abs(t[i] - t[j]);
        }
    }
    distance.sort(function (a, b) { return a[0] - b[0]; });
    variogram.range = distance[(n * n - n) / 2 - 1][0];
    let lags = ((n * n - n) / 2) > 30 ? 30 : (n * n - n) / 2;
    let tolerance = variogram.range / lags;
    let lag = rep(0, lags);
    let semi = rep(0, lags);
    if (lags < 30) {
        for (l = 0; l < lags; l++) {
            lag[l] = distance[l][0];
            semi[l] = distance[l][1];
        }
    }
    else {
        for (i = 0, j = 0, k = 0, l = 0; i < lags && j < ((n * n - n) / 2); i++, k = 0) {
            while (distance[j][0] <= ((i + 1) * tolerance)) {
                lag[l] += distance[j][0];
                semi[l] += distance[j][1];
                j++;
                k++;
                if (j >= ((n * n - n) / 2))
                    break;
            }
            if (k > 0) {
                lag[l] /= k;
                semi[l] /= k;
                l++;
            }
        }
        if (l < 2)
            return variogram;
    }
    n = l;
    variogram.range = lag[n - 1] - lag[0];
    let X = rep(1, 2 * n);
    let Y = Array(n);
    let A = variogram.A;
    for (i = 0; i < n; i++) {
        switch (model) {
            case 'gaussian':
                X[i * 2 + 1] = 1.0 - Math.exp(-(1.0 / A) * Math.pow(lag[i] / variogram.range, 2));
                break;
            case 'exponential':
                X[i * 2 + 1] = 1.0 - Math.exp(-(1.0 / A) * lag[i] / variogram.range);
                break;
            case 'spherical':
                X[i * 2 + 1] = 1.5 * (lag[i] / variogram.range)
                    - 0.5 * Math.pow(lag[i] / variogram.range, 3);
                break;
        }
        Y[i] = semi[i];
    }
    let Xt = matrixTranspose(X, n, 2);
    let Z = matrixMultiply(Xt, X, 2, n, 2);
    Z = matrixAdd(Z, matrixDiag(1 / alpha, 2), 2, 2);
    let cloneZ = Z.slice(0);
    if (matrixChol(Z, 2)) {
        matrixChol2inv(Z, 2);
    }
    else {
        matrixSolve(cloneZ, 2);
        Z = cloneZ;
    }
    let W = matrixMultiply(matrixMultiply(Z, Xt, 2, 2, n), Y, 2, n, 1);
    variogram.nugget = W[0];
    variogram.sill = W[1] * variogram.range + variogram.nugget;
    variogram.n = x.length;
    n = x.length;
    let K = Array(n * n);
    for (i = 0; i < n; i++) {
        for (j = 0; j < i; j++) {
            K[i * n + j] = variogram.model(Math.pow(Math.pow(x[i] - x[j], 2)
                + Math.pow(y[i] - y[j], 2), 0.5), variogram.nugget, variogram.range, variogram.sill, variogram.A);
            K[j * n + i] = K[i * n + j];
        }
        K[i * n + i] = variogram.model(0, variogram.nugget, variogram.range, variogram.sill, variogram.A);
    }
    let C = matrixAdd(K, matrixDiag(sigma2, n), n, n);
    let cloneC = C.slice(0);
    if (matrixChol(C, n)) {
        matrixChol2inv(C, n);
    }
    else {
        matrixSolve(cloneC, n);
        C = cloneC;
    }
    let K1 = C.slice(0);
    let M = matrixMultiply(C, t, n, n, 1);
    variogram.K = K1;
    variogram.M = M;
    return variogram;
}
function predict(x, y, variogram) {
    let i;
    let k = Array(variogram.n);
    for (i = 0; i < variogram.n; i++) {
        k[i] = variogram.model(Math.pow(Math.pow(x - variogram.x[i], 2)
            + Math.pow(y - variogram.y[i], 2), 0.5), variogram.nugget, variogram.range, variogram.sill, variogram.A);
    }
    return matrixMultiply(k, variogram.M, 1, variogram.n, 1)[0];
}
function variance(x, y, variogram) {
    let i;
    let k = Array(variogram.n);
    for (i = 0; i < variogram.n; i++) {
        k[i] = variogram.model(Math.pow(Math.pow(x - variogram.x[i], 2) + Math.pow(y - variogram.y[i], 2), 0.5), variogram.nugget, variogram.range, variogram.sill, variogram.A);
    }
    let val = matrixMultiply(matrixMultiply(k, variogram.K, 1, variogram.n, variogram.n), k, 1, variogram.n, 1)[0];
    return variogram.model(0, variogram.nugget, variogram.range, variogram.sill, variogram.A) + val;
}
function grid(polygons, variogram, width) {
    let i;
    let j;
    let k;
    let n = polygons.length;
    if (n === 0)
        return;
    let xlim = [polygons[0][0][0], polygons[0][0][0]];
    let ylim = [polygons[0][0][1], polygons[0][0][1]];
    for (i = 0; i < n; i++) {
        for (j = 0; j < polygons[i].length; j++) {
            if (polygons[i][j][0] < xlim[0])
                xlim[0] = polygons[i][j][0];
            if (polygons[i][j][0] > xlim[1])
                xlim[1] = polygons[i][j][0];
            if (polygons[i][j][1] < ylim[0])
                ylim[0] = polygons[i][j][1];
            if (polygons[i][j][1] > ylim[1])
                ylim[1] = polygons[i][j][1];
        }
    }
    let xtarget;
    let ytarget;
    let a = Array(2);
    let b = Array(2);
    let lxlim = Array(2);
    let lylim = Array(2);
    let x = Math.ceil((xlim[1] - xlim[0]) / width);
    let y = Math.ceil((ylim[1] - ylim[0]) / width);
    let A = Array(x + 1);
    for (i = 0; i <= x; i++)
        A[i] = Array(y + 1);
    for (i = 0; i < n; i++) {
        lxlim[0] = polygons[i][0][0];
        lxlim[1] = lxlim[0];
        lylim[0] = polygons[i][0][1];
        lylim[1] = lylim[0];
        for (j = 1; j < polygons[i].length; j++) {
            if (polygons[i][j][0] < lxlim[0])
                lxlim[0] = polygons[i][j][0];
            if (polygons[i][j][0] > lxlim[1])
                lxlim[1] = polygons[i][j][0];
            if (polygons[i][j][1] < lylim[0])
                lylim[0] = polygons[i][j][1];
            if (polygons[i][j][1] > lylim[1])
                lylim[1] = polygons[i][j][1];
        }
        a[0] = Math.floor(((lxlim[0] - ((lxlim[0] - xlim[0]) % width)) - xlim[0]) / width);
        a[1] = Math.ceil(((lxlim[1] - ((lxlim[1] - xlim[1]) % width)) - xlim[0]) / width);
        b[0] = Math.floor(((lylim[0] - ((lylim[0] - ylim[0]) % width)) - ylim[0]) / width);
        b[1] = Math.ceil(((lylim[1] - ((lylim[1] - ylim[1]) % width)) - ylim[0]) / width);
        for (j = a[0]; j <= a[1]; j++) {
            for (k = b[0]; k <= b[1]; k++) {
                xtarget = xlim[0] + j * width;
                ytarget = ylim[0] + k * width;
                if (pip(polygons[i], xtarget, ytarget)) {
                    A[j][k] = predict(xtarget, ytarget, variogram);
                }
            }
        }
    }
    return {
        xlim: xlim,
        ylim: ylim,
        width: width,
        data: A,
        zlim: [min(variogram.t), max(variogram.t)],
    };
}
function plot(canvas, grid, xlim, ylim, colors) {
    let ctx = canvas.getContext('2d');
    let data = grid.data, zlim = grid.zlim, width = grid.width;
    if (ctx) {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        let range = [xlim[1] - xlim[0], ylim[1] - ylim[0], zlim[1] - zlim[0]];
        let i = void 0;
        let j = void 0;
        let x = void 0;
        let y = void 0;
        let z = void 0;
        let n = data.length;
        let m = data[0].length;
        let wx = Math.ceil(width * canvas.width / (xlim[1] - xlim[0]));
        let wy = Math.ceil(width * canvas.height / (ylim[1] - ylim[0]));
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                if (data[i][j] === undefined)
                    continue;
                x = canvas.width * (i * width + grid.xlim[0] - xlim[0]) / range[0];
                y = canvas.height * (1 - (j * width + grid.ylim[0] - ylim[0]) / range[1]);
                z = (data[i][j] - zlim[0]) / range[2];
                if (z < 0.0)
                    z = 0.0;
                if (z > 1.0)
                    z = 1.0;
                // ctx.fillStyle = colors[Math.floor((colors.length - 1) * z)];
                ctx.fillStyle = getColor(colors,data[i][j]);
                ctx.fillRect(Math.round(x - wx / 2), Math.round(y - wy / 2), wx, wy);
            }
        }
    }
}

//自定义色彩
function getColor(colors, z) {
	let l = colors.length;
	for (let i = 0; i < l; i++) {
		if (z >= colors[i].min && z < colors[i].max) {    
            return colors[i].color;
        }
	}
	if (z < 0) {
		return colors[0].color;
	}
}

let index = {
    train: train,
    predict: predict,
    variance: variance,
    grid: grid,
    plot: plot,
    max: max,
    min: min,
    pip: pip,
    rep: rep,
    matrixDiag: matrixDiag,
    matrixTranspose: matrixTranspose,
    matrixAdd: matrixAdd,
    matrixMultiply: matrixMultiply,
    matrixChol: matrixChol,
    matrixChol2inv: matrixChol2inv,
    matrixSolve: matrixSolve,
    variogramGaussian: variogramGaussian,
    variogramExponential: variogramExponential,
    variogramSpherical: variogramSpherical,
};

export default index;
export { grid, matrixAdd, matrixChol, matrixChol2inv, matrixDiag, matrixMultiply, matrixSolve, matrixTranspose, max, min, pip, plot, predict, rep, train, variance, variogramExponential, variogramGaussian, variogramSpherical };
//# sourceMappingURL=kriging.esm.js.map

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

特种作业管理系统 —— 企业安全与效率的卓越保障

在当今复杂多变的工业生产和作业环境中&#xff0c;安全与效率是企业发展的两大核心关键。我们深知您在特种作业管理方面面临着诸多挑战&#xff0c;如作业流程的规范性、证件的有效管理以及设备的安全运行等。今天&#xff0c;我们为您带来一款专门解决这些问题的创新产品——…

如何解决项目申报过程中文件管理混乱问题?

在项目申报的复杂流程中&#xff0c;文件管理是一项至关重要的环节。它直接关系到项目信息的完整性、安全性和可访问性。然而&#xff0c;传统的文件管理方式往往面临诸多痛点&#xff0c;如资料分散、权限混乱、版本冲突等。 文件管理痛点 资料分散难管理&#xff1a;在项目…

2024年【黑龙江省安全员C证】报名考试及黑龙江省安全员C证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 黑龙江省安全员C证报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新黑龙江省安全员C证免费试题题目及答案&#xff01;多做几遍&#xff0c;其实通过黑龙江省安全员C证模拟考试很简单。 1、【多选题】《…

如何搭建测试平台?理清思路很重要

01 测试平台 01 职责 一个健康的测试平台体系&#xff0c;对测试人员的职责分工、协作模式会有不同的要求。 测试平台核心的职责是完成高质量的交付已满足业务需求。测试活动包括单元测试、集成测试、接口测试、性能测试等&#xff0c;都是通过这些测试手段&#xff0c;协同…

22k star,最强开源堡垒机,强推

最开始接触jumpserver已经是五年前了&#xff0c;最近又发布了最新的v3版本&#xff0c;迫不及待的就去体验了一波&#xff0c;真心不错&#xff0c;增加很多新的功能&#xff0c;操作真的丝滑&#xff0c;比起公司采购的上个世纪的堡垒机真心好用多了。 1 jumpserver简介 ju…

【linux进程】深度理解进程--什么是进程什么是pcb进程创建

目录 前言一&#xff0c;对PCB的理解二&#xff0c;CPU对进程列表的处理三&#xff0c;进程标识符:pid1. 查看系统进程1: ps axj2. 查看系统进程2: /proc 四&#xff0c;系统调用函数:getpid五&#xff0c;父进程和子进程的概念六&#xff0c;创建子进程--fork函数的使用1. 创建…

CSS颜色设置

我们在显示屏上看到的各种颜色都是通过红&#xff08;red&#xff09;、绿&#xff08;green&#xff09;、蓝&#xff08;blue&#xff09;三原色组合而成的&#xff0c;按不同的比例混合这三种颜色就可以得到其它颜色&#xff0c;通过调整红、绿、蓝三种颜色的数值可以最大限…

微信开发者工具审查界面元素

一、打开调试器 二、审查元素 点击调试器左边的箭头&#xff0c;将鼠标放在界面上即可审查元素

Node-RED-L2-Node-RED在Linux系统启动时自动运行

Node-RED在Linux系统启动时自动运行 目的步骤1创建服务文件&#xff1a;2重新加载服务&#xff1a;3启用服务&#xff1a;4启动Node-RED服务&#xff1a;5检查服务状态&#xff1a;6其他说明7如果没启动正确的Node-RED执行路径&#xff1a;确保使用绝对路径&#xff1a; 检查用…

Servlet入门:服务端小程序的初试(自己学习整理的资料)

目录 一.前言 二.建立基础结构​编辑 三.具体步骤 找到Tomcat文件并打开Tomcat。 在webapps中创建一个自己的文件夹。 在classes中新建一个Java文件。 在lib中导入需要的jar文件包。 配置环境变量 在Java文件的目录下打开cmd并输入 javac -d . HelloServlet.java进行…

深兰科技陈海波应邀出席2024长三角论坛暨虹桥人才创新发展大会

近日&#xff0c;以“人才引领 联动共融——国际化创新与长三角协同”为主题的“2024长三角人才发展论坛暨虹桥人才创新发展大会”在上海国际会议中心隆重举行。上海市委常委、组织部部长、市委人才办主任张为应邀出席并做大会致辞。 深兰科技创始人、董事长陈海波作为特邀企业…

多用户自定义商城小程序源码系统 独立部署 到源代码包以及搭建部署教程

系统概述 随着移动互联网的迅猛发展&#xff0c;消费者的购物习惯逐渐向线上转移。传统电商平台虽然提供了一定的便利&#xff0c;但也存在一些局限性&#xff0c;如高昂的入驻费用、缺乏个性化定制等。为了适应市场需求&#xff0c;多用户自定义商城小程序源码系统应运而生。…

linux 之0号进程、1号进程、2号进程

一、0号进程 0号进程&#xff0c;通常也被称为idle进程&#xff0c;或者也称为swapper进程&#xff0c;其 pid 等于0。 0号进程是linux启动的第一个进程&#xff0c;它的task_struct的comm字段为"swapper",所以也称为swpper进程。 kernel/include/linux/init_task…

IO分类,IO模型,Java中的IO模式

写在前面 本文看下几个比较容易混肴的概念&#xff0c;IO分类&#xff0c;IO模型&#xff0c;Java的IO模式。当然&#xff0c;都是我自己的理解&#xff0c;有哪里不对的&#xff0c;烦请留言告知。 1&#xff1a;IO分类 IO分类是针对阻塞与非阻塞&#xff0c;异步与同步来讲…

.net 到底行不行!2000 人在线的客服系统真实屏录演示(附技术详解)

业余时间用 .net 写了一个免费的在线客服系统&#xff1a;升讯威在线客服与营销系统。 时常有朋友问我性能方面的问题&#xff0c;正好有一个真实客户&#xff0c;在线的访客数量达到了 2000 人。在争得客户同意后&#xff0c;我录了一个视频。 升讯威在线客服系统可以在极低…

基于SSM+Vue+MySQL的农家乐预约管理系统

系统展示 用户前台界面 管理员后台界面 农家乐后台界面 系统背景 随着乡村旅游的兴起&#xff0c;农家乐作为一种结合农业体验与休闲度假的新型旅游模式&#xff0c;受到了广大游客的青睐。然而&#xff0c;传统农家乐在预约管理方面存在效率低下、信息不透明等问题&#xff0c…

头戴式耳机百元测评推荐有哪些?头戴式耳机性价比排名推荐!

在音频设备日益普及的今天&#xff0c;头戴式耳机因其出色的音质和舒适度备受欢迎。然而&#xff0c;面对市场上琳琅满目的百元耳机&#xff0c;消费者常常感到困惑。头戴式耳机百元测评推荐有哪些&#xff1f;在这篇文章中&#xff0c;我们将测评并推荐几款性价比极高的头戴式…

Python爬虫之requests模块(一)

Python爬虫之requests模块&#xff08;一&#xff09; 学完urllib之后对爬虫应该有一定的了解了&#xff0c;随后就来学习鼎鼎有名的requests模块吧。 一、requests简介。 1、什么是request模块&#xff1f; requests其实就是py原生的一个基于网络请求的模块&#xff0c;模拟…

第一届POLARDB数据库性能大赛-亚军0xCC☣☢比赛攻略

关联比赛: 第一届POLARDB数据库性能大赛 1 赛题分析 本次大赛的初赛和复赛的赛题内容是一脉相传的&#xff0c;主要内容都是实现一个KV数据库存储引擎&#xff0c;实现随机插入&#xff0c;随机查询&#xff0c;区间查询这三个功能。赛题的难点主要有两个&#xff1a;1、实现在…

C#常用数据结构栈的介绍

定义 在C#中&#xff0c;Stack<T> 是一个后进先出&#xff08;LIFO&#xff0c;Last-In-First-Out&#xff09;集合类&#xff0c;位于System.Collections.Generic 命名空间中。Stack<T> 允许你将元素压入栈顶&#xff0c;并从栈顶弹出元素。 不难看出&#xff0c;…