duangsuse::Echo
现在开始讲解方才 @drakeet 的排序问题 5 没有被手动排序过,5 排在 1 前面,4 被手动排序过,4 也在 1 前面,但 5 和 4 却无法得出谁在谁前 至于这个偏序理论(因为冰封这翻译得很全)(指原文... 因为好像最后没有翻译完)呢,其实是蛮大的知识体系,主要是和数学一些其他的杂七杂八东西比如几何学、集合什么的绑在一起了 https://baike.baidu.com/item/%E5%81%8F%E5%BA%8F%E5%85%B3%E7%B3%BB/943166?fromtitle=…
咳咳... 冒犯一点说,这代码是我在 LayoutFormatter 里看到的(我只能找到一点 给 google 的 PR, 因为基本都是些板凳条凳的代码风格问题(而且还比较盲目地去掉了 id 名里的视图类型、把 UiXXXX 改成了 UIXXXX,不太符合原项目上 camelCase 分词优雅性规则,但是 JDK11 是...),项目依赖管理貌似出现了问题,后来就没被 merge),而它已经被 Drakeet 删掉了... 或者闭源了
好吧,我好歹还是找了一会...
https://github.com/bangarharshit/Gradle-Layout-Formatter/blob/master/buildSrc/src/main/java/com/bangarharshit/layoutformatter/Formatter.java#L202
啊我的眼睛要瞎了,这洋文水平.... 这处理算法逻辑的结构,那么像之前那个秀炸的二进制手算偏移量处理 AxmlParser,我真的... 真的... 无法限制自己的语言... 🤐
啊这个项目是很秀的,秀了一下自己对 Gradle (非 Groovy) 的理解(Plugin,Tasks,Configuration,FileTree),写了个格式化 Plugin,可是我怎么总觉得很奇怪,明明这些工程师知道的那么多,可偏偏不能再懂得多一点... 再多考虑一些东西,再多一点就更好了...
好吧,根据
总之... 我感觉,我应该告别旧时抄代码,不知道自己在做什么的历史了... 扯远了
好吧,我好歹还是找了一会...
https://github.com/bangarharshit/Gradle-Layout-Formatter/blob/master/buildSrc/src/main/java/com/bangarharshit/layoutformatter/Formatter.java#L202
啊我的眼睛要瞎了,这洋文水平.... 这处理算法逻辑的结构,那么像之前那个秀炸的二进制手算偏移量处理 AxmlParser,我真的... 真的... 无法限制自己的语言... 🤐
啊这个项目是很秀的,秀了一下自己对 Gradle (非 Groovy) 的理解(Plugin,Tasks,Configuration,FileTree),写了个格式化 Plugin,可是我怎么总觉得很奇怪,明明这些工程师知道的那么多,可偏偏不能再懂得多一点... 再多考虑一些东西,再多一点就更好了...
好吧,根据
javaFiles 这个言不及义的局部变量名,我觉得有部分源码可能是“抄”的。因为“我”并不真正理解我所做的事情... 某个新建的 task 需要一个 fileTree 来遍历,作为它实例的变量,那我的 Plugin 就负责注册这个 Task 到 TargetProject,然后设置 fileTree 为 rootProject.fileTree(dir: rootProject.dir, include: ['**/layout/*.xml']),可惜不直接用 Groovy 写算了。总之... 我感觉,我应该告别旧时抄代码,不知道自己在做什么的历史了... 扯远了
GitHub
Build software better, together
GitHub is where people build software. More than 31 million people use GitHub to discover, fork, and contribute to over 100 million projects.
duangsuse::Echo
咳咳... 冒犯一点说,这代码是我在 LayoutFormatter 里看到的(我只能找到一点 给 google 的 PR, 因为基本都是些板凳条凳的代码风格问题(而且还比较盲目地去掉了 id 名里的视图类型、把 UiXXXX 改成了 UIXXXX,不太符合原项目上 camelCase 分词优雅性规则,但是 JDK11 是...),项目依赖管理貌似出现了问题,后来就没被 merge),而它已经被 Drakeet 删掉了... 或者闭源了 好吧,我好歹还是找了一会... https://github.c…
一言以蔽之:『解析算法』是可用的,但是未免也太... 莫名其妙了.... 而且不 effective,有个该抽提成循环的不抽提,有个方法的名字根本是错的,算了我不说原因...
那么我们看看排序算法。
最后我们再谈谈最上面的问题
5 没有被手动排序过,5 在 1 前面,4 被手动排序过,4 也在 1 前面,可 5 和 4 谁在谁前?
要排序的集合。{5, 4, 1}
所谓的手动排序,我们认为,就是用户手动给某个元素(或许可以用 hashCode 来标识)指定一个位置,用户希望看到这个元素永远处于那个位置
元素 1 的位置记为 p1
用户把 5 固定在一个位置 p5,并且 p5 在 p1 『前面』(它的 index < p1)
用户把 4 固定在一个位置 p4,并且 p4 也在 p1 前面
可是 5 和 4 谁在前面,能不能成为一个不可解决的问题呢? 🤔
首先看看满足需求的位置 p5 p4 存不存在:存在
我们以索引的
5,可以对应索引 1
4,就对应 2
1,就对应 3
[5, 4, 1]
约束条件:
p5 < p1 成立
p4 < p1 成立
所以就这里,不存在任何问题。
那么 5 和 4 又谁在前面? 🤔
其实我很好奇,大家看起来好像我是蛮智障一样(误打误撞错写 drakeet 之前写的交换排序成了类似的选择排序),排序算法都不会写,但是我打包票一旦我理解了一个东西,就肯定是彻底的理解 — 我知道我在做什么,我明白算法的每一个步骤对它处理的影响,而不是瞎猜!
很简单啊?按照之前的手段再比较一下不就好了?
按照升序排列,5 (不小于) 4,所以 4 排在 5 前面。
那么这么简单的问题,为啥 drakeet 会提出并且引以为 PureWriter 不支持『同时自动手动排序』的理论?
因为 drakeet 理解这个问题的方式和我有点不一样,我不知道之前更加幼稚的我所想的『看不到所谓有序后面完全可以无序,或者说被 sort API 限制了视野』是不是真的,但我想他的顾虑可能就只是无法在『用户指定位置』和自动排序之间找到平衡点,毕竟我也隐隐约约觉得除了上面的这个问题外,还有更严重的问题,再比如,如果表长有变化(完全可能有 Insert/Delete 这种操作),那『固定』位置应该怎么处理?如果『固定位置』的约束条件开始互相冲突,还能进行(对固定位置的)自动排序吗?
这的确是个问题,不过我打算解决这个问题。如果剩下的时间里还有足够的时间编程和学习抽象模型,我会写一个 PoC 出来,证明对列表的不同部分使用不同的排序算法和『固定位置』是可行的,而且也可以在考虑固定位置的情况下进行插入/删除/更新操作。
算法的思路可能就是:
fixed:
0 | z
list:
1 | a
2 | b
3 | c
view:
— 0 | z
1 | a
2 | b
3 | c
我们认为所有的『区分排序』表都是由两部分组成的:已固定表(实现时使用 fixed index set 和 collect with index 函数实现)和主表
排序的时候,把这『一个表』映射为两个表(main 和 fixed),每个表都会记录它的项目之前的位置,并且在排序之后重新合并为一个新表,看起来就像表的一部分位置单独采用了另一种排序方法一样
main:
0 | 4
2 | 1
3 | 4
4 | 2
fixed:
1 | 5
5 | 6
== 单独进行排序和位置合并 ==
原 main / fixed:
那么我们看看排序算法。
int i, j;
String temp;
for (i = start; i < end - 1; i++) {
for (j = start; j < end - 1 - i + start; j++) {
if (getLinePriority(lines.get(j)) > getLinePriority(lines.get(j + 1))) {
temp = lines.get(j);
lines.set(j, lines.get(j + 1));
lines.set(j + 1, temp);
}
}
}
不考虑不重要的事情(区间)for (int i = 0; i < li; i++)
for (int j = 0; j < (li-i) - 1; j++)
if (! (lines[j].compareTo(lines[j+1]) <0) )
{ /* swap(lines[j], lines[j+1]) */ }
🤔 弄了半天是我搞错了... i 果然就是个计数变量,本身就是真正的无优化 bubble sort 的...,就知道我肯定(又)不长脑子!(上一次是我在写快速排序的时候)最后我们再谈谈最上面的问题
5 没有被手动排序过,5 在 1 前面,4 被手动排序过,4 也在 1 前面,可 5 和 4 谁在谁前?
要排序的集合。{5, 4, 1}
所谓的手动排序,我们认为,就是用户手动给某个元素(或许可以用 hashCode 来标识)指定一个位置,用户希望看到这个元素永远处于那个位置
元素 1 的位置记为 p1
用户把 5 固定在一个位置 p5,并且 p5 在 p1 『前面』(它的 index < p1)
用户把 4 固定在一个位置 p4,并且 p4 也在 p1 前面
可是 5 和 4 谁在前面,能不能成为一个不可解决的问题呢? 🤔
首先看看满足需求的位置 p5 p4 存不存在:存在
我们以索引的
(<) 偏序集来表示,当然存在的啊!至少,如果我们不考虑来全称量化推广的话。5,可以对应索引 1
4,就对应 2
1,就对应 3
[5, 4, 1]
约束条件:
p5 < p1 成立
p4 < p1 成立
所以就这里,不存在任何问题。
那么 5 和 4 又谁在前面? 🤔
其实我很好奇,大家看起来好像我是蛮智障一样(误打误撞错写 drakeet 之前写的交换排序成了类似的选择排序),排序算法都不会写,但是我打包票一旦我理解了一个东西,就肯定是彻底的理解 — 我知道我在做什么,我明白算法的每一个步骤对它处理的影响,而不是瞎猜!
很简单啊?按照之前的手段再比较一下不就好了?
按照升序排列,5 (不小于) 4,所以 4 排在 5 前面。
那么这么简单的问题,为啥 drakeet 会提出并且引以为 PureWriter 不支持『同时自动手动排序』的理论?
因为 drakeet 理解这个问题的方式和我有点不一样,我不知道之前更加幼稚的我所想的『看不到所谓有序后面完全可以无序,或者说被 sort API 限制了视野』是不是真的,但我想他的顾虑可能就只是无法在『用户指定位置』和自动排序之间找到平衡点,毕竟我也隐隐约约觉得除了上面的这个问题外,还有更严重的问题,再比如,如果表长有变化(完全可能有 Insert/Delete 这种操作),那『固定』位置应该怎么处理?如果『固定位置』的约束条件开始互相冲突,还能进行(对固定位置的)自动排序吗?
这的确是个问题,不过我打算解决这个问题。如果剩下的时间里还有足够的时间编程和学习抽象模型,我会写一个 PoC 出来,证明对列表的不同部分使用不同的排序算法和『固定位置』是可行的,而且也可以在考虑固定位置的情况下进行插入/删除/更新操作。
算法的思路可能就是:
fixed:
0 | z
list:
1 | a
2 | b
3 | c
view:
— 0 | z
1 | a
2 | b
3 | c
我们认为所有的『区分排序』表都是由两部分组成的:已固定表(实现时使用 fixed index set 和 collect with index 函数实现)和主表
排序的时候,把这『一个表』映射为两个表(main 和 fixed),每个表都会记录它的项目之前的位置,并且在排序之后重新合并为一个新表,看起来就像表的一部分位置单独采用了另一种排序方法一样
[4, $5, 1, 4, 2, $6] => 排序main:
0 | 4
2 | 1
3 | 4
4 | 2
fixed:
1 | 5
5 | 6
== 单独进行排序和位置合并 ==
原 main / fixed:
[4, 1, 4, 2] [5, 6]
原 main / fixed indices:[0, 2, 3, 4] [1, 5]main 和 fixed 在排序的过程中是互相透明的,排序算法单独对两个集合进行排序操作而不能看见另一个集合里的元素,这也符合用户对『固定位置』概念的预期。
duangsuse::Echo
一言以蔽之:『解析算法』是可用的,但是未免也太... 莫名其妙了.... 而且不 effective,有个该抽提成循环的不抽提,有个方法的名字根本是错的,算了我不说原因... 那么我们看看排序算法。 int i, j; String temp; for (i = start; i < end - 1; i++) { for (j = start; j < end - 1 - i + start; j++) { if (getLinePriority(lines.get(j)) >…
刚才的简单交换排序也可以写成:
但其实不是冒泡排序...
== 单独进行排序和位置合并(刚才一条太长写不下) ==
原 main / fixed:
有序 main /fixed
原 main / fixed indices:
for (int i = 0; i < li; i++)
for (int j = 1; j < li - i; j++)
if (! (lines[j-1].compareTo(lines[j]) <0) )
swap(lines[j], lines[j-1]);
本质上就是『最大的元素像冒泡一样从表头交换到表尾』但其实不是冒泡排序...
== 单独进行排序和位置合并(刚才一条太长写不下) ==
原 main / fixed:
[4, 1, 4, 2] [5, 6]
原 main / fixed indices:[0, 2, 3, 4] [1, 5]
== 单独进行排序 ==有序 main /fixed
[1, 2, 4, 4] [6, 5]
== 合并回原列表索引原 main / fixed indices:
[0, 2, 3, 4] [1, 5]
然后二分查找数索引 pair 有序列表 RandomAccess,合并得出结果。[1, 6, 2, 4, 4, 5]
duangsuse::Echo
刚才的简单交换排序也可以写成: for (int i = 0; i < li; i++) for (int j = 1; j < li - i; j++) if (! (lines[j-1].compareTo(lines[j]) <0) ) swap(lines[j], lines[j-1]); 本质上就是『最大的元素像冒泡一样从表头交换到表尾』 但其实不是冒泡排序... == 单独进行排序和位置合并(刚才一条太长写不下) == 原 main / fixed: [4, 1, 4, 2]…
5 没有被手动排序过,5 在 1 前面,4 被手动排序过,4 也在 1 前面,可 5 和 4 谁在谁前?
或者也可以看作是命题组:i1 := {a list element position}
exists i5 in {N}. i5 < i1
exists i4 in {N}. i4 < i1
这两个都是成立的,但是,如果要这么想
exists i in {N}. i5 < i < i4 就是不可能的,因为
(<) 是具有传递性的,若 i5 lessThan i,并且 i lessThan i4,那就是说 i5 lessThan i4,这是不符合预期的(逻辑性质比这举的例子有用多了,可惜我不是特别懂)那如果说
exists i in {N}. 4 < i < 5 也是不可能的,并没有一个自然数比 4 大但是比 5 小,这后面自然也有基础偏序理论和基本数论... (或者说,{N} 是不连续,或者说离散的数集,{R} 则是连续的)但是,把 {N} 换成 {R} 就成立了
#Android 类似的设计详询 Android Input Methods API,这有专门的种类抽象,肯定的,Java Swing 我不清楚,GTK Qt WxWidgets Windows Forms 的我也不清楚...。
Android Developers
Create an input method | Android Developers
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (YuutaW 鱼塔)
记得 Telegram 私密聊天也会
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (YuutaW 鱼塔)
GitHub
Trumeet/Random-picture
🖼 A tiny, pure random picture service which can random a picture for users from your favorite list - Trumeet/Random-picture
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (YuutaW 鱼塔)
(只有一个源程式文件和一个 Dockerfile(
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (YuutaW 鱼塔)
一个小时写好(
不会吧?我看 java.lang.Random 的好像不会(exclusive)...
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (YuutaW 鱼塔)
DDoS 测试了下(1000 次),发现 Random 会不时给出最大值(
#Coolapk 🌝 禁用也没用,反正我逆向的是 v8 最新的算法,厉害或者觉得底层系统小白 + GCC 很『黑盒』就再来。
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (YuutaW 鱼塔)
5 分钟左右酷安禁用了 V7 的发送功能,我 7 分钟前还发过.....
#Sysadmin #Linux Yuuta 大器晚成(跑)哦,应该早点的。(现在应该学着背诵一下根目录结构:dev proc sys home root usr var lib tmp boot / shm tun tty pts binfmt_misc selinux)和诸如 fstab, keyboard layouts, timezone, dns (resolv.conf) 这种需要配置的东西,如果要做集群管理员,RAID 磁盘阵列什么的,R0 R1 R1+0 R5 必须知道呢,iptables 也得会用,AWK SED 什么的应该能加分,不会 bash 是万万不可的
[ $? -eq 0 ] || printf "😃"; exec exit &; local case, ${0:-}