因为我躺床上也想了很久都没有结果(都是一些比较浅层的结论,似乎靠树形图 也没有特别多的效果)
思量着 要上 可视化 拿命分析 只要分析完能力能有提升,哪怕以后都要拿命分析 也在所不辞
思量着 要上 可视化 拿命分析 只要分析完能力能有提升,哪怕以后都要拿命分析 也在所不辞
XjbBcj.hs
1.4 KB
#Haskell #Algorithm 仅仅是比原版换了一点命名大概,主体逻辑没有区别,但即使是模板 弄不懂的话 也是没有意义的呢。
/tmp/duangsuse.sock
#Haskell XJB 写的树状数组离散化并查集,不过是抄的...(默写的) 自己还不是很理解,看看
来看一下我们的测试题目。首先是初始化并查集内容(Zi=1)部分
是数组 离散化 存储的一个树,数组是一个 mapping,K 是 Int, V 是 Int
a=1; b=2, 先去找两个 deep ancestor: ap, bp
拿到的肯定是 vec[1] vec[2] 本身(n == i)
然后去存 nodes[1].parent = nodes[2] 就发现 1 和 2 是一锅的
3 4 同理,n[3].parent = n[4]; n[4].parent = nil(4)
2 3 的话,就体现 优化,要找爸爸树
2 的话,找到 n[2] (是 1 的爹),然后它是爹的 child
3 的话,找到 n[3] (是 4 的 娃),然后它的爹就是 4, 顺带传递性相等, n[3] 的爹 也是 4 肯定
n[3] = n[4]
这样的话,A={1,3,2} B={2,4,3}
首先就是构造这种 爹树
1 -> 2
2 -> 2 (inserting 2, 3)
2 -> nil
3 -> 4
3 -> 4 (inserting 2, 3)
4 -> nil
集合并的是那 (A | B) = {1,2,4},那就发现其实 22 33 都没有意义,为什么不当自己的爹,剪掉
那并还有 B 没有的 为什么不直接用空间 保存住,可是不是分开保存的
必须是树,在一起的话 有一个爹 不是一集人不认一个爹,那爹是怎么一起认的呢?就是当儿子、合并
那如何查找爹树?
1 2 是否在同一集合内?
1 -> 2
2 -> 2 那都是一个爹的 娃,是
2 3 是否在一个集合呢?
2 -> 2 可是 3 是否有一个爹呢?
3 -> 4 -> 4 没有一个爹(找完了都
3 4 是否呢?
3 -> 4
4 -> 4
有一个爹,是一集和的 爹(
O A B现在这个集合里 应该怎么样呢?
1 1 2
1 3 4
1 2 3
是数组 离散化 存储的一个树,数组是一个 mapping,K 是 Int, V 是 Int
a=1; b=2, 先去找两个 deep ancestor: ap, bp
拿到的肯定是 vec[1] vec[2] 本身(n == i)
然后去存 nodes[1].parent = nodes[2] 就发现 1 和 2 是一锅的
3 4 同理,n[3].parent = n[4]; n[4].parent = nil(4)
2 3 的话,就体现 优化,要找爸爸树
2 的话,找到 n[2] (是 1 的爹),然后它是爹的 child
3 的话,找到 n[3] (是 4 的 娃),然后它的爹就是 4, 顺带传递性相等, n[3] 的爹 也是 4 肯定
n[3] = n[4]
这样的话,A={1,3,2} B={2,4,3}
首先就是构造这种 爹树
1 -> 2
2 -> 2 (inserting 2, 3)
2 -> nil
3 -> 4
3 -> 4 (inserting 2, 3)
4 -> nil
集合并的是那 (A | B) = {1,2,4},那就发现其实 22 33 都没有意义,为什么不当自己的爹,剪掉
那并还有 B 没有的 为什么不直接用空间 保存住,可是不是分开保存的
必须是树,在一起的话 有一个爹 不是一集人不认一个爹,那爹是怎么一起认的呢?就是当儿子、合并
那如何查找爹树?
1 2 是否在同一集合内?
1 -> 2
2 -> 2 那都是一个爹的 娃,是
2 3 是否在一个集合呢?
2 -> 2 可是 3 是否有一个爹呢?
3 -> 4 -> 4 没有一个爹(找完了都
3 4 是否呢?
3 -> 4
4 -> 4
有一个爹,是一集和的 爹(
Forwarded from Deleted Account
... 就是 merge 的时候 deep merge 找野爹(跑,是最远的爹)然后每层都去建立传递关系
find 的时候问野(爹 是否是一个爹(之前同集合的都传递了)
每个数 都可能是别人的爸爸(喜当爹,逃
find 的时候问野(爹 是否是一个爹(之前同集合的都传递了)
每个数 都可能是别人的爸爸(喜当爹,逃
Forwarded from Deleted Account
有点 LuaOOP 虚表继承的感觉,每个树都可能有爹,爹有很多儿子、爹只能有一个爹
Forwarded from Deleted Account
虚表是每次递归查找到了复制,并查树也是
两者都是传递性,不过一个是为了缓存(也是性质)传递、一个是一元相关性传递
两者都是传递性,不过一个是为了缓存(也是性质)传递、一个是一元相关性传递
Forwarded from Deleted Account
cats 就是找某个 node 最远的爹,然后一下解决所有娃子的传递性问题,concat 到一起去
对应的 find 实现是为了践行这个理念,顺便有缓存剪枝
可是具体的,比如 find 的
对应的 find 实现是为了践行这个理念,顺便有缓存剪枝
可是具体的,比如 find 的
(make me dptr) 到底是不是删掉也正确,不清楚...我终于知道为什么很多出版物里都能找到不完美的地方了,原来尽可能去修改就有这么难啊...
本来已经修改了很多地方,换掉了不少有问题或者可以改进的表达,再看一遍,我又找到比原来还多数目的...
本来已经修改了很多地方,换掉了不少有问题或者可以改进的表达,再看一遍,我又找到比原来还多数目的...
目前我依然在修改,将在基本完成后对内容进行最后的校验
今天明天内,我会给它加一些 JavaScript 小挂件来提升阅读体验
目前还在对内容进行校对
今天明天内,我会给它加一些 JavaScript 小挂件来提升阅读体验
目前还在对内容进行校对
Forwarded from 荔枝木
“我的朋友们啊,”他说,“我——我——”
但是他哽住了,他说不下去了。
他转身朝着黑板,拿起一支粉笔,使出全身的力量,写了四个大字:“熊猫万岁!”
然后他呆在那儿,头靠着墙壁,话也不说,只向我们做了一个手势:“关站了,你们走吧。”
但是他哽住了,他说不下去了。
他转身朝着黑板,拿起一支粉笔,使出全身的力量,写了四个大字:“熊猫万岁!”
然后他呆在那儿,头靠着墙壁,话也不说,只向我们做了一个手势:“关站了,你们走吧。”
刚才被冰封批判了一番,两年进步的的确是很少了(
我还有脸讲什么 #Haskell, Monad 都不会
连 Identity/Reader Monad 都还无法默写,真是...
而且我还没有拿 Haskell 写过解释器,一个计算器求值的都是常量、纯的无参表达式,这怎么能叫做解释器呢...
推荐大家去关注 github.com/HoshinoTented 大佬,大小姐很擅长各种算法和 Kotlin... 和 Haskell,我就只是会点无聊的... 泪目
我还有脸讲什么 #Haskell, Monad 都不会
连 Identity/Reader Monad 都还无法默写,真是...
而且我还没有拿 Haskell 写过解释器,一个计算器求值的都是常量、纯的无参表达式,这怎么能叫做解释器呢...
推荐大家去关注 github.com/HoshinoTented 大佬,大小姐很擅长各种算法和 Kotlin... 和 Haskell,我就只是会点无聊的... 泪目
GitHub
HoshinoTented - Overview
impl !Ord for Self {}. HoshinoTented has 41 repositories available. Follow their code on GitHub.
https://blog.hoshino9.org/2019/07/26/how-to-create-a-wonderful-type.html
艹,刚才看星野野大佬的博文才知道
就只告诉我
艹,刚才看星野野大佬的博文才知道
newtype 是简易 Product 的构造方法(不能是 Sum type),之前欧阳继超大佬的猫论指南就只告诉我
newtype 是定义同构类型(newtype Identity a = Identity { runIdentity :: a })...blog.hoshino9.org
Haskell 如何打造爆款数据类型
数据类型是 Haskell 中的重要知识之一这篇文章讲教你从一无所知到随手打造爆款数据类型
啊,那个我没有考虑到,其实... 写的插件还可以讲一下,所以前端给 #HTML #JavaScript
之前因为 Fx 阅读模式里面 link anchor 有 underline(decoration) 所以想加去这个的 CSS,后来才知道本来就没有...
如果有的话,可以
首先是 NSFW Template,这使用到了 HTML5 的新 <template> tag
bound 本来确实可以利用 property/reflect/proxy 来比较魔法的(而且不会担心性能问题,可以缓存)
不过有点长,而且不明显,所以这里用简单的方法
== Abbr view
这个逻辑比较简单,类似 NSFW template。因为在一些设备上不能使用 "hover" 查看 abbrev... 只好在点击时在后面插入内 abbr 的实际容了。
写入的时候先新建一个 attribute,用于记录 abbr 已经被展开,每次 switch 的时候判断一下 shown => hide、hidden => show
== Night
== Reflink Preview
== Music Player
== Footnote Xref
== Contents Tree
之前因为 Fx 阅读模式里面 link anchor 有 underline(decoration) 所以想加去这个的 CSS,后来才知道本来就没有...
如果有的话,可以
a { text-decoration: none; }
接下来简要说说几个小辅助插件了首先是 NSFW Template,这使用到了 HTML5 的新 <template> tag
bound 本来确实可以利用 property/reflect/proxy 来比较魔法的(而且不会担心性能问题,可以缓存)
不过有点长,而且不明显,所以这里用简单的方法
function bound(self, meth) { return self[meth].bind(self); }
function intoIter(xs) { var i = 0;
return function
iterator() { return (i<xs.length)? { value: xs[i++], done: false }
: {done:true}; }; }
function tryIter(xs) { if (!Symbol) return intoIter(xs); return bound(xs[Symbol.iterator](), 'next'); }
function forIter(it, f) { var xc; while (xc = it()) { f(xc.value); if (xc.done) break; } }
function args2ary(argsv) { var ary=[]; forIter(tryIter(argsv), bound(ary, 'push')); return ary; }
Function.prototype.flip = function() { var method = this; return function call() { return method.apply(method, args2ary(arguments).reverse()); }; };
Function.prototype.curry1 = function(x0) { return this.bind(this, x0); }
;
Object.prototype.lets = function(f) { return f(this); }
Function.prototype.andThen = function(g) { var f=this; return function composition(x) { return g(f(x)); }; }
foreach = tryIter.andThen(bound(forIter, 'curry1'));
function makes$_(fname) { return function(it) { return it[fname](); }; }
function makes_() {
var it = new Object();
return new Proxy(it, { get: function(t,a,p){return makes$_(a);} });
}
_ = makes_();
cssSelect = bound(document, 'querySelector');
var merges = bound(document, 'importNode').flip().curry1(true);
其中业务逻辑 部分,上面的留作代码重用function showTemplate(attr, init) {
var templates = cssSelect('template[' + attr + ']=""');
var prepend = function (nd, x) { nd.parentNode.insertBefore(x, nd); };
templates.forEach(function(x) {
var mix = merges(x.content);
if (typeof init =='function') init(mix);
prepend(x, mix);
});
}
function removeElements(cs) { cs.lets(cssSelect).each(_.delete); }
function addCSSClass(cl) { return function(e){ e.classList.add(cl); }; }
showTemplate('nsfw', addCSSClass('nsfw'));
我还得写很多.... 所以代码重用、优先划分好模块非常重要== Abbr view
这个逻辑比较简单,类似 NSFW template。因为在一些设备上不能使用 "hover" 查看 abbrev... 只好在点击时在后面插入内 abbr 的实际容了。
写入的时候先新建一个 attribute,用于记录 abbr 已经被展开,每次 switch 的时候判断一下 shown => hide、hidden => show
== Night
== Reflink Preview
== Music Player
== Footnote Xref
== Contents Tree
/tmp/duangsuse.sock
啊,那个我没有考虑到,其实... 写的插件还可以讲一下,所以前端给 #HTML #JavaScript 之前因为 Fx 阅读模式里面 link anchor 有 underline(decoration) 所以想加去这个的 CSS,后来才知道本来就没有... 如果有的话,可以 a { text-decoration: none; } 接下来简要说说几个小辅助插件了 首先是 NSFW Template,这使用到了 HTML5 的新 <template> tag bound 本来确实可以利用 prope…
... 我不该写 js 的,虽然好像我总是写错代码.... 怎么连 bounds 都忘记了
另外 JavaScript 想写简洁真难啊,看起来明明可以 point-free 的话 就不得不引入新匿名函数了
另外 JavaScript 想写简洁真难啊,看起来明明可以 point-free 的话 就不得不引入新匿名函数了
/tmp/duangsuse.sock
啊,那个我没有考虑到,其实... 写的插件还可以讲一下,所以前端给 #HTML #JavaScript 之前因为 Fx 阅读模式里面 link anchor 有 underline(decoration) 所以想加去这个的 CSS,后来才知道本来就没有... 如果有的话,可以 a { text-decoration: none; } 接下来简要说说几个小辅助插件了 首先是 NSFW Template,这使用到了 HTML5 的新 <template> tag bound 本来确实可以利用 prope…
艹!劳资不滋瓷 ES5 了,辣鸡浏览器看什么文章!
原有风格也不重写了,以后用 babel 算了!(嗳我为啥写 JS 啊)
原有风格也不重写了,以后用 babel 算了!(嗳我为啥写 JS 啊)
记录一种思维方式:
刚才在回答 @Zhai2333 大佬的问题时我提到了树(Trees)
我说(伪jzm 🐸)
我提到了树和 OI,这不禁使我想到了之前看 OI 入门书的二叉树,然后我就不禁考虑到了一个问题:完全二叉树(除了最后一层 leaf 外、每一层都有两个子节点)如果层数是 n 层,那么一共有多少个节点?(弄错问题了... 是第 n 层有多少节点、那个除了递归或者 sum 外,或者手动试着代数化简、我没办法)
本来是很 immediate 的内容(发答案了,就是 (n-1)**2 + 1)
n-1 是因为第 0 层很特殊、 +1 是补回第 0 层
我却想了一会(虽然开始我隐约有正确表达式的直觉,虽然只是一个伸展的树形图样,然后两层之间存在某种运算连接起来的那样)而且还体会到了之前完全不懂数学的恐惧... 😨
现在我得到了答案(莫名其妙就又想到了,噢,原来不每层就是前面的 n-1 层 *2 么)(我的递归素质就有这么差....)
同时又得到了两个思考方法:
1. 考虑递归程序的时候,把每层看成是自己想要的数据。
比如上面的算层数、每个节点就是一个『1』
这样你就能有
给我一种感觉 好像要反过去回溯的时候 才能感受到这种可能...
2. 考虑递归程序的时候,只看一层不够就看两层
bin0 = bin1 + 1 + bin1
bin1 = bin2 + 1 + bin2
....
bin2 = 1
3. 可视化数学计算,这样你就可以把数据结构和数学式子一起对称着看了
比如,要有把乘方看成树形的能力:
首先,我不知道为什么就没有看根节点...
然后,每一层都有 2 个子树、直到 (n-1) 层(最后一层没有子树只有叶子,要不然你也不能非惰性地构造 infinity data structure)
本来我开始没有想出来的原因是我觉得这是递归的,没法直接算...(其实也是可以的)(废话)
后来发现,其实要求第 n 层(第 0 层就是 1),只需算 n**2 即可(每层都叉一次 *2、叉了这么多次,有这么多个 1)
...
唉,现在就只有这点水平
不过你看完后就发现,其实“数学”和编程从本质上看都是没有差别的,解析数学、微积分什么的也是属于数学的 buff,但都是很『基础』的东西
刚才在回答 @Zhai2333 大佬的问题时我提到了树(Trees)
我说(伪jzm 🐸)
但是我想,我见到你们这样热情啊,一句话不说也不好。所以你刚才你一定要——在宣传上将来如果你们报道上有偏差,你们要负责。我没有说这很简单(逆向 JavaScript),没有任何这个意思。但是你问……你一定要觉得要问我……对这类代码保护措施有没有方法。我能不能写 AST 模式识别重构器?AST 处理是编译原理优化编译入门技能,我怎么能不会?...
你们毕竟还 too young(太年轻),明白这意思吧。我告诉你们我是身入树状图了,见得多了!啊,OI 入门的哪一个算法我没讲过?码农他们——你……你们要知道,美国的 @ice1000 ,那比你们不知道高到哪里去了。啊,我跟他谈笑风生!所以说编程啊,要……还是要提高自己的知识水平!懂我的意思——识得唔识得啊?(懂不懂啊?)(逃跑,,,我很菜的,不过希望有点幽默的说
我提到了树和 OI,这不禁使我想到了之前看 OI 入门书的二叉树,然后我就不禁考虑到了一个问题:完全二叉树(除了最后一层 leaf 外、每一层都有两个子节点)如果层数是 n 层,那么一共有多少个节点?(弄错问题了... 是第 n 层有多少节点、那个除了递归或者 sum 外,或者手动试着代数化简、我没办法)
本来是很 immediate 的内容(发答案了,就是 (n-1)**2 + 1)
n-1 是因为第 0 层很特殊、 +1 是补回第 0 层
我却想了一会(虽然开始我隐约有正确表达式的直觉,虽然只是一个伸展的树形图样,然后两层之间存在某种运算连接起来的那样)而且还体会到了之前完全不懂数学的恐惧... 😨
现在我得到了答案(莫名其妙就又想到了,噢,原来不每层就是前面的 n-1 层 *2 么)(我的递归素质就有这么差....)
同时又得到了两个思考方法:
1. 考虑递归程序的时候,把每层看成是自己想要的数据。
比如上面的算层数、每个节点就是一个『1』
这样你就能有
root = 1 + bin这种图的直觉了,然而光有它还不够,你要能看 (1 + 1) | (1 + 1) 换得成什么...
bin = bin + 1 + bin
给我一种感觉 好像要反过去回溯的时候 才能感受到这种可能...
2. 考虑递归程序的时候,只看一层不够就看两层
bin0 = bin1 + 1 + bin1
bin1 = bin2 + 1 + bin2
....
bin2 = 1
3. 可视化数学计算,这样你就可以把数据结构和数学式子一起对称着看了
比如,要有把乘方看成树形的能力:
2**3=4. 最后上面的问题我是怎么解决的,
(2*2)+2
/ \
2 2
首先,我不知道为什么就没有看根节点...
然后,每一层都有 2 个子树、直到 (n-1) 层(最后一层没有子树只有叶子,要不然你也不能非惰性地构造 infinity data structure)
本来我开始没有想出来的原因是我觉得这是递归的,没法直接算...(其实也是可以的)(废话)
后来发现,其实要求第 n 层(第 0 层就是 1),只需算 n**2 即可(每层都叉一次 *2、叉了这么多次,有这么多个 1)
...
唉,现在就只有这点水平
不过你看完后就发现,其实“数学”和编程从本质上看都是没有差别的,解析数学、微积分什么的也是属于数学的 buff,但都是很『基础』的东西