hupo0 最近的时间轴更新
hupo0

hupo0

V2EX 第 460436 号会员,加入于 2019-12-20 17:29:05 +08:00
今日活跃度排名 3247
感觉这次写的库能比 js 原生数组方法要快
  •  2   
    JavaScript  •  hupo0  •  44 天前  •  最后回复来自 cenbiq
    28
    [合 zu] 南 2 环 5/14 地铁 芳城园 1 区 2 居室主卧 2300/月
    北京  •  hupo0  •  91 天前  •  最后回复来自 hupo0
    2
    给一个类 rxjs 的库写了篇介绍
    JavaScript  •  hupo0  •  103 天前  •  最后回复来自 beyondex
    5
    [合 zu] 邻近 5/14 地铁 芳城园 1 区 2 居室主卧 2300
    北京  •  hupo0  •  106 天前  •  最后回复来自 hupo0
    1
    hupo0 最近回复了
    为了能在 mac 和 windows 上开发同一个项目,我选择了 vscode + cmake 。由于一些个人喜好,配置起来花了不少时间。

    如果学习用的是 windows 系统,Visual Studio 是最友善的了。
    @xingshu1990 点外卖时会比较累。健身餐之类我会去了解下。我目的也不是减肥,是想饮食上能更科学点,对自己的身体状态多点信心。特别注重这些,也许是有点心理因素存在。
    @iannil 多余的蛋黄怎么办,扔了好浪费。
    @iannil 我眼瞎了,没看到绿色蔬菜啥的。
    @iannil 考虑到消化系统的“作息时间”,应该得分成 3-4 顿来吃吧。然后像维生素和一些人体所需的微量元素,怎么从食物补充?
    @TomatoYuyuko 确实有在考虑代餐
    没有厌食症,一天三餐都按时吃。
    ``` javascript
    // 生成用来观察的数列
    var dictionary_array = function (x) {
    var i = 1;
    return new Array(x)
    .fill(0)
    .map((_) => i++)
    .map((x) => x.toString())
    .sort();
    };

    // 发现 n 满足 9, 99, 999, ... 的时候,数列很有规律

    // 只考虑 n 满足 9, 99, 999, ... 的情况
    var fromNeat = function (n, k) {
    const group_length = n / 9; // 经过观察,1 - 9 开头的数可以分成整齐的 9 组

    // 经过观察,每 1 组 有 111 个连续 x 开头的数,他的第 2 个起,会有连续 11 个 0 开头的数,以此类推

    const _k = k - 1; // 如果 1 组 11 个数,k 为 11 时,其实在第 1 组,所以应该以 0 开始作为下标,方便运算
    let next_k = _k % group_length;

    const group_index = (_k - next_k) / group_length; // 求组别的下标
    const head = group_index + 1; // 组别从 1 开始
    let guess = head; // 猜出第 1 个数字

    if (next_k === 0) {
    // k 是某组的第 1 个时,可以直接返回 guess
    return guess;
    }

    let _n_1 = group_length; // 表示连续 n 个 1
    while (true) {
    // 对 111 降级 11,以此类推
    _n_1 = down(_n_1);

    if (_n_1 === 0) {
    // 无法降级,可以直接返回 guess
    return guess;
    }

    const k = next_k - 1; // k 从第 2 个开始
    next_k = k % _n_1;
    const next_guess = (k - next_k) / _n_1; // 组别从 0 开始
    guess = guess * 10 + next_guess;

    if (next_k === 0) {
    return guess;
    }
    }
    };

    var down = function (_n_1) {
    return Math.floor(_n_1 / 10);
    };

    // 当 n 在 99, 999, 9999, 之间,数列就没之前规律
    // 但可以观察出,只有左边的一部分是不规律的,右边的与之前一样
    var fromNormal = function (n, k) {
    const neat_n = neatN(n);
    const diff = n - neat_n;

    if (diff === 0) {
    return fromNeat(n, k);
    }

    const break_group = Math.ceil(diff / neat_n); // 不整齐的组数
    const neat_group = 9 - break_group; // 整齐的组数
    const group_length = neat_n / 9;
    const neat_start = n - neat_group * group_length;

    if (neat_start < k) {
    // k 在整齐的部分
    return fromNeat(neat_n, k - neat_start + group_length);
    }

    // 我猜左边是更大的 neat_n 整齐的时候。
    return fromNeat(neat_n * 10 + 9, k);
    };

    var neatN = function (n) {
    return Math.pow(10, Math.floor(Math.log10(n + 1))) - 1;
    };

    var findKthNumber = function (n, k) {
    // 处理下输入边界
    if (n < 9) {
    return k;
    }

    return fromNormal(n, k);
    };

    ```

    思路都在上面了,这就 100%。

    如 5 楼所说,这是个时间复杂度为 log10(n)的问题,尝试构造实际的数组,是做不出来的。
    @hupo0 我靠,我想换行怎么就发出去了。
    https://github.com/Iplaylf2/no-stream
    主要看顶级目录,package.json 和 gulpfile.js 。
    你可以参考别人的库是怎么打 npm 包和发布的,比如说我的。
    44 天前
    回复了 hupo0 创建的主题 JavaScript 感觉这次写的库能比 js 原生数组方法要快
    @cenbiq 看看所谓的 Zero cost abstraction - 刘雨培的文章 - 知乎
    https://zhuanlan.zhihu.com/p/24975048
    吐槽 C# - 刘雨培的文章 - 知乎
    https://zhuanlan.zhihu.com/p/30653282

    参考这两篇回答,17 年的 C#还没有对 linq 进行优化。虽然用迭代器也是相当于只遍历一遍,但是迭代器“调用”迭代器的过程还是会有额外的性能损耗。完美一点的是,能做到跟 C++一样,把迭代器 yield 的逻辑内联到一个循环里。

    想来 no-stream 的做法,是函数调用层面,把"yield"部分通过函数包函数的方式合并到一个循环里。虽然也是有函数调用方面的开销,但目前来看,会比 JS 的 Generator 还节省性能些。

    从现有的 C++和 Rust 的案例来看,其实正道还是 iterator,似乎这样的结构更容易优化。linq 也是在正道上,只是需要引擎对这部分进行优化。与之对应的是 JS 的 Generator 。可惜就是目前他们还很拉胯。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1428 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 17:27 · PVG 01:27 · LAX 10:27 · JFK 13:27
    ♥ Do have faith in what you're doing.