duangsuse::Echo
算法实现, 和《算法图解》版本不一样的地方在于,不是 costs.filter { !it.second.walked }.minBy { it.second.cost }, 只有队列自动忽略走过的节点,没有『最便宜』,只是全部队列处理完(虽然在无环的情况下未必得记住哪些已经处理过)
...头疼,现在还有如下问题:
1. 为什么《图解》上的版本,自动寻找当前离 GraphRoot 最近的一个节点作为扫描起始位置
这和使用队列的版本有区别吗?如果随便选择一个还没算 succ 路径的节点而不是『最近节点』会不会有问题?
2. 看起来对于所有节点来说,走过一遍意味着已经确定它余下边链接节点的开销?
还是说它的最廉价路径确定了?这样相对 DFS 枚举路径的版本优化了多少?
3. 这个版本的封装很差劲... 真是...
1. 为什么《图解》上的版本,自动寻找当前离 GraphRoot 最近的一个节点作为扫描起始位置
这和使用队列的版本有区别吗?如果随便选择一个还没算 succ 路径的节点而不是『最近节点』会不会有问题?
2. 看起来对于所有节点来说,走过一遍意味着已经确定它余下边链接节点的开销?
还是说它的最廉价路径确定了?这样相对 DFS 枚举路径的版本优化了多少?
3. 这个版本的封装很差劲... 真是...
duangsuse::Echo
算法实现, 和《算法图解》版本不一样的地方在于,不是 costs.filter { !it.second.walked }.minBy { it.second.cost }, 只有队列自动忽略走过的节点,没有『最便宜』,只是全部队列处理完(虽然在无环的情况下未必得记住哪些已经处理过)
『假装以后会去学习算法的样子』
但即使以后会一点这种幼稚园算法,也不能达到我想要的高度呢。 看来还需要理解...
—
沉思(迫真)了半个小时后稍微有了点理解,学到了
但即使以后会一点这种幼稚园算法,也不能达到我想要的高度呢。 看来还需要理解...
—
沉思(迫真)了半个小时后稍微有了点理解,学到了
duangsuse::Echo
『假装以后会去学习算法的样子』 但即使以后会一点这种幼稚园算法,也不能达到我想要的高度呢。 看来还需要理解... — 沉思(迫真)了半个小时后稍微有了点理解,学到了
今天试着去理解了一下,回答之前的几个问题
1. Dijkstra 算法到底是怎么做到的、为什么每次要取没访问过的『最近』节点?如果不取最近的可以吗?
Dijkstra 算法的确就是『简单地遍历一次(不算取最小的遍历)』然后就可以得到任意端 A 到端 B 的最短距离
为什么每次要取最近的节点?因为 Dijkstra 算法从『最终开销和』的侧面看(何况每个最终到达算相邻端点距离后,就不能再次访问了),它必须得取和访问过程最相符的『最近』端点开始
比如,这里有一张图
A >1> B
B >2> C
A >4> C
C >1> D
假设 Dij 算过 A 的目标开销后,每次不是取最近,而是取随便一个端点开始
比如,它取到了 C,然后更新目标们的开销。C 此时的开销是 4(这是个危险信号,注意这不是最小开销!)
Dijkstra 算法遍历过程中有一个很重要的性质:每个被『走过』(也即计算邻端点开销)的点,计算邻边的时候都是自己的『最低开销』
然后取 B,此时 C 的开销被更新了(为 3, 可是 C 已经被走过了,这个值无法再传递给 C 的邻居)
这样 C 通过一个非最新的开销 4 达到了 D(5),算法终止
如果『随便』取到了一个当时没有算出路径到达的节点就更 NB 了 — 它所有邻端的距离都被『锁定』为 Infinity,并且如果这个节点是邻端们唯一的前驱,它们就永远“不可达”了 🌚
2. 之前的算法有啥问题?
其实 Dijkstra 算法利用副作用(也可以不用,主要是给每个端点维护『最低开销』)不是不可以使用递归来写
Dijkstra 算法是从『距离』的角度看路径计算,有时候你也可以感觉到它应用了类似快速排序里的『传递』
算法里每次只算一个『最近』端点,更新可达目标的开销,但是通过回溯的思路想,这是在所有『可用前驱』里选择一个(本身开销+链接开销)开销最小的,最终得到的就是整个问题的最优解
这也是算法每次取『最近』(『开销最小的前驱』)端点更新它所有目标开销的原因,如果随便取就炸了
算法『传递』的是路径的开销大小,它使用的『开销』数据得提供一个『加法』操作一个『比较』操作,依此来指导路径开销的选择 — 取最小的
只有所有最近的可达路径被尝试完了,端点才被『访问』,锁定了它邻边的开销(因为端点的『距离』,肯定是比它的前驱们要远的,即便已经有了一个可用路径也是一样)
之前的算法针对 (1) 里的问题也无法得到正确的解,因为它没有使用『最低开销』传递的操作 — 选择所有邻端点访问,并且走过也不能再走
顺序很重要 — 如果第一次走过的时候(确认了以当前端点为前驱的所有节点当前最小开销)该节点本身的开销不是最小的呢?
因为它只是 BFS 而已,所以遇到节点本身被更新的情况,也无法传递下去,也炸了... #Algorithm
1. Dijkstra 算法到底是怎么做到的、为什么每次要取没访问过的『最近』节点?如果不取最近的可以吗?
Dijkstra 算法的确就是『简单地遍历一次(不算取最小的遍历)』然后就可以得到任意端 A 到端 B 的最短距离
为什么每次要取最近的节点?因为 Dijkstra 算法从『最终开销和』的侧面看(何况每个最终到达算相邻端点距离后,就不能再次访问了),它必须得取和访问过程最相符的『最近』端点开始
比如,这里有一张图
A >1> B
B >2> C
A >4> C
C >1> D
假设 Dij 算过 A 的目标开销后,每次不是取最近,而是取随便一个端点开始
比如,它取到了 C,然后更新目标们的开销。C 此时的开销是 4(这是个危险信号,注意这不是最小开销!)
Dijkstra 算法遍历过程中有一个很重要的性质:每个被『走过』(也即计算邻端点开销)的点,计算邻边的时候都是自己的『最低开销』
然后取 B,此时 C 的开销被更新了(为 3, 可是 C 已经被走过了,这个值无法再传递给 C 的邻居)
这样 C 通过一个非最新的开销 4 达到了 D(5),算法终止
如果『随便』取到了一个当时没有算出路径到达的节点就更 NB 了 — 它所有邻端的距离都被『锁定』为 Infinity,并且如果这个节点是邻端们唯一的前驱,它们就永远“不可达”了 🌚
2. 之前的算法有啥问题?
其实 Dijkstra 算法利用副作用(也可以不用,主要是给每个端点维护『最低开销』)不是不可以使用递归来写
Dijkstra 算法是从『距离』的角度看路径计算,有时候你也可以感觉到它应用了类似快速排序里的『传递』
算法里每次只算一个『最近』端点,更新可达目标的开销,但是通过回溯的思路想,这是在所有『可用前驱』里选择一个(本身开销+链接开销)开销最小的,最终得到的就是整个问题的最优解
这也是算法每次取『最近』(『开销最小的前驱』)端点更新它所有目标开销的原因,如果随便取就炸了
算法『传递』的是路径的开销大小,它使用的『开销』数据得提供一个『加法』操作一个『比较』操作,依此来指导路径开销的选择 — 取最小的
只有所有最近的可达路径被尝试完了,端点才被『访问』,锁定了它邻边的开销(因为端点的『距离』,肯定是比它的前驱们要远的,即便已经有了一个可用路径也是一样)
之前的算法针对 (1) 里的问题也无法得到正确的解,因为它没有使用『最低开销』传递的操作 — 选择所有邻端点访问,并且走过也不能再走
顺序很重要 — 如果第一次走过的时候(确认了以当前端点为前驱的所有节点当前最小开销)该节点本身的开销不是最小的呢?
因为它只是 BFS 而已,所以遇到节点本身被更新的情况,也无法传递下去,也炸了... #Algorithm
https://github.com/lensh/vue-qq #China #dev
ECMAScript + Vue 的 QQ-like IM 实现
技术栈有标明
== 客户端
Vue2
Vuex — 组件状态共享
Vue-Router — 单页路由库
localStorage — 本地持久化存储
== 界面
Vueg — 转场特效
IScroll — 仿『原生』滚动效果
=== 开发工具
Webpack — Web 打包
CSS3(Flex)/SCSS — CSS Preprocessor
ES2015 & Babel — ES6 特性支持(如 async、Promise)
== 传输层
Axios — requests
Socket.io — WebSocket::IO 平等即时传输
jsonp — 跨域请求数据
== 服务端
Express/Koa — HTTP 服务框架
MySQL — 现代关系型数据库 给的附注是比 Mongo 好,因为关系复杂文档型数据库不能胜任
== 部署层
pm2 — process service manager/monitor
nginx — 转发什么的
ECMAScript + Vue 的 QQ-like IM 实现
技术栈有标明
== 客户端
Vue2
Vuex — 组件状态共享
Vue-Router — 单页路由库
localStorage — 本地持久化存储
== 界面
Vueg — 转场特效
IScroll — 仿『原生』滚动效果
=== 开发工具
Webpack — Web 打包
CSS3(Flex)/SCSS — CSS Preprocessor
ES2015 & Babel — ES6 特性支持(如 async、Promise)
== 传输层
Axios — requests
Socket.io — WebSocket::IO 平等即时传输
jsonp — 跨域请求数据
== 服务端
Express/Koa — HTTP 服务框架
MySQL — 现代关系型数据库 给的附注是比 Mongo 好,因为关系复杂文档型数据库不能胜任
== 部署层
pm2 — process service manager/monitor
nginx — 转发什么的
GitHub
GitHub - lensh/vue-qq: 🎨 Vue family bucket with socket.io and express/koa2 , create a web version of mobile QQ, supporting real…
🎨 Vue family bucket with socket.io and express/koa2 , create a web version of mobile QQ, supporting real-time group chat, real-time private chat, special care, shielding chat, smart IP geographic...
我数学很菜,而且不懂物理,写不出公式
虽然可以做一点编程,但是写在一个文件里,还那么多动画什么的 一个框架也不用 做不到
虽然可以做一点编程,但是写在一个文件里,还那么多动画什么的 一个框架也不用 做不到
duangsuse::Echo
#Android https://github.com/LineageOS/android_frameworks_base/tree/cm-14.1/packages/SystemUI/src/com/android/systemui/egg 膜
赏析(使用了后来的 M Land,因为这个版本的逻辑不如后来的清晰) #CG
private static floatluma
(int bgcolor) {
return 0.2126f * (float) (bgcolor & 0xFF0000) / 0xFF0000
+ 0.7152f * (float) (bgcolor & 0xFF00) / 0xFF00
+ 0.0722f * (float) (bgcolor & 0xFF) / 0xFF;
}
灰度函数GitHub
LineageOS/android_frameworks_base
Contribute to LineageOS/android_frameworks_base development by creating an account on GitHub.
private voidrealignPlayers
() {
final int N = mPlayers.size();
float x = (mWidth - (N-1) * PARAMS.PLAYER_SIZE) / 2;
for (int i=0; i<N; i++) {
final Player p = mPlayers.get(i);
p.setX(x);
x += PARAMS.PLAYER_SIZE;
}
}
放置 playpublic static final float lerp(float x, float a, float b) {
return (b - a) * x + a;
}
public static final float rlerp(float v, float a, float b) {
return (v - a) / (b - a);
}
public static final float clamp(float f) {
return f < 0f ? 0f : f > 1f ? 1f : f;
} 好像是算加速角度的数学函数
public voidstep
(long t_ms, long dt_ms, float t, float dt) {
单步GitHub
LineageOS/android_frameworks_base
Contribute to LineageOS/android_frameworks_base development by creating an account on GitHub.
GAPP项目.txt
2.2 KB
#GeekApk Prototype Project 组成,其中很大一部分(比方说,Literate Kotlin)我都已经打过不少实现稿了(就拿上面那个来说,我都考虑过怎么解析 .kt 文件跨模块引用和拿到其他模块的 html 地址了,也考虑过如何使用 TokenizerRangeMap 进行高亮和加引用/id、多个<code> 如何『视作一起』解析如何『分开来』高亮引用处理操作,staging-intro 主要的内容和布局也想好了)
#Android 最终可行答案:
val gesturedet = GestureDetector(object : GestureDetector.OnGestureListener {
override fun onDown(m: MotionEvent) = true
override fun onSingleTapUp(m: MotionEvent) = false
override fun onShowPress(m: MotionEvent) = Unit
override fun onLongPress(m: MotionEvent) = Unit
override fun onScroll(m0: MotionEvent, m1: MotionEvent, dx: Float, dy: Float) = false
override fun onFling(m0: MotionEvent, m1: MotionEvent, vx: Float, vy: Float) = false
})
backcontainer.setOnTouchListener { v, mot ->
v.performClick()
return gesturedet.onTouchEvent(mot)
};Telegram
Bill Valentine in [CN] Android Dev
Forwarded from 虚拟歌姬鸢大头🥛
请问我想把绿色的textview的点击、长按、触摸都交给它后面那个linearlayout处理,应该怎么做
shape type="oval":
stroke:
width: 9px
color: white
size: {width: 20px, height: 20px}Forwarded from 🌞🌞🌞 small2Sun
我这个双向绑定问题在哪?为什么我的布局应用多个ItemView后,一个ItemView的text值修改,其他的值虽然界面没变动,但是获取值的时候,其他ItemView的text值就变成了我修改的值。
#Android Studio IDE 3.5 更新给 XML 自动格式化的时候,因为 XML 过于可配置,不同的 schema 标签顺序语义还不一致,
并且 XML 格式化默认配置导入捉鸡,自动给许多 XML 加上了 Tag arrangement... 导致一些开发者写的文档被迫真『有序』(乱序)
并且 XML 格式化默认配置导入捉鸡,自动给许多 XML 加上了 Tag arrangement... 导致一些开发者写的文档被迫真『有序』(乱序)
Forwarded from hoshi
自己改配置吧 把xml arrangement 的 tag arrange 去掉
Forwarded from Kanter
使用navigation需要注意的坑:
1、生命周期问题,看源码,navigation是用replace而不是hide+add,且由于加入了回退栈,所以不会执行onDestroy生命周期,但会销毁视图执行onDestroyView。一些和UI相关的解绑操作(比如Rxjava)需要移动到onDestroyView,否则会内存泄露。
2、动画执行问题,setCustomAnimations可以设置四个动画,但动画的执行还是很难受,这应该算是fragment库的问题。像fragment A —>fragment B,A 不动,B从A上面横向进入的效果无法实现,因为A的动画和B的是叠在一起的。
1、生命周期问题,看源码,navigation是用replace而不是hide+add,且由于加入了回退栈,所以不会执行onDestroy生命周期,但会销毁视图执行onDestroyView。一些和UI相关的解绑操作(比如Rxjava)需要移动到onDestroyView,否则会内存泄露。
2、动画执行问题,setCustomAnimations可以设置四个动画,但动画的执行还是很难受,这应该算是fragment库的问题。像fragment A —>fragment B,A 不动,B从A上面横向进入的效果无法实现,因为A的动画和B的是叠在一起的。