并查集的正确使用姿势

因为工作的关系,不得不学习了几种算法,好久不用又忘记了,这是一篇复习文章。

并查集回答的是连接问题,比如说从 a 城到 b 城有没有路,能回答有或者没有,但是不能回答具体的路是那几条,该怎么走;再比如说 a、z 这 2 个人能否通过共同好友的名片分享来加上微信。

并查集是解决点与点之间的关系,遇到实际问题的时候,需要我们进行转换成点与点,也就是建模。在数据结构上一般用数组来存储这些点。

继续阅读“并查集的正确使用姿势”

函数柯里化

函数柯里化是一个很有意思的话题,用起来也非常的神奇有趣。以前的我不太想深入的去了解这个话题,今天做了一些例子放在下面,加深理解。

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

https://zh.wikipedia.org/wiki/%E6%9F%AF%E9%87%8C%E5%8C%96

简单理解,就是将一个可以接受多个参数的函数转化成可以接受任意个数参数的函数。我们可以将 curry 函数简化成这样:

继续阅读“函数柯里化”

使用 prettier 格式化 PHP 代码

在 js 项目中,因为使用了 prettier,可以一顿乱写,完全不管格式,写完之后,在自动保存的时候使用 prettier 格式化一下。代码又变成了美美哒、井然有序的样子,这种体验非常好。这种好的体验,应该怎么复制到 PHP 的开发中呢?那么请看这篇文章吧。

继续阅读“使用 prettier 格式化 PHP 代码”

解决 mac 下 xampp 安装 WordPress 插件需要 ftp 账号

xampp、ftp、mac、wordpress

想在 mac 里做点 wordpress 开发没有那么困难,安装 xampp 就行,而且是免费的。

但是在默认情况下,安装 wordpress 插件需要 ftp 账号的权限,怎么解决呢?于是就有了这个文章。因为我从网上找答案还是花了一些时间,所以有记录一下的必要。

在 wp-config.php 中添加

define( 'FS_METHOD', 'direct' ); 
// 定义这个常量是做什么用的,我并没有深究。

更改文件的权限

sudo chmod -R 777 /Applications/XAMPP/xamppfiles/htdocs/

上面是更改对应目录下的权限,找到对应的目录,比如我的是:/Users/zengliaoliao/.bitnami/stackman/machines/xampp/volumes/root/htdocs/zengxiaoluan,这样就搞定了。

参考链接:https://www.youtube.com/watch?v=dn6_nYQFjok

audio 可视化

audio、audio visualization、可视化、音乐韵律可视化

在某些移动设备上,可能不能查看到效果,可以在电脑上的浏览器尝试。

注意

我们可能好奇某些音乐播放器,那些跳来跳去的韵律图是怎么做出来的,点击下面👇的播放按钮播放音乐,查看 audio 可视化。

您的浏览器不支持 canvas 继续阅读“audio 可视化”

最小生成树 kruskal 算法 js 实现

本站以前有一篇文章提到了 prim 算法的实现,具体点这里,我写了完整的示例,和优化版的 prim 在时间上的对比。现在我们来看另一种思路:Kruskal。

话不多说,先看实际效果和结论。在 1k 个节点里,lazy prim 耗时在 4s 左右,优化后的 prim 在 900ms 左右,而更高效的 Kruskal 在 600ms 左右。测试的前提条件是基于我的电脑硬件配置和 1k 个节点的完全稠密图。

要实现高效的 Kruskal 算法,需要基于高效的并查集数据结构,但是并查集我们不在这篇文章里谈及,我们主要谈谈 Kruskal 的思路。

继续阅读“最小生成树 kruskal 算法 js 实现”

最小生成树 prim 算法的 js 实现

最小生成树 prim 算法的 JavaScript 实现

说明:以下示例请在较新的浏览器中查看,因为用了 class 语法。

写这篇文章的缘起

在 pcb 设计中,有一种东西叫飞线,他的生成原理主要就是使用了最小生成树算法。最小生成树是什么效果,可以看下面的例子。想知道飞线的具体应用可点击这里。工作中有用到,那必须得学习。

飞线也称跳线,是指印刷电路板上因设计缺陷、测试目的或是其他设计考量,将电路板上的两个节点直接用电线连通的一种方法。

维基百科
继续阅读“最小生成树 prim 算法的 js 实现”

文件上传进度和解析 Form Data

最近有一个小需求:上传文件的时候显示上传进度(上传了百分之多少)。这个需求不难,比如以下代码就能实现:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Upload file</title>
    <script>
      function uploadFile() {
        var fd = new FormData(document.forms[0]);
        var xhr = new XMLHttpRequest();

        xhr.upload.onprogress = function (e) {
          console.log('e.loaded:' + e.loaded + ', e.total:' + e.total)
          console.log(Math.round(e.loaded / e.total * 100) + '%') // 这里是上传进度
        }

        xhr.onreadystatechange = function(){
          if ( xhr.readyState === 4 ) {
            if ( xhr.status >= 200 && xhr.status < 300 || xhr.status === 304 ) {
              console.log(xhr.responseText)
            }
          }
        }

        xhr.open("POST", "/");
        xhr.send(fd);
      }
    </script>
  </head>
  <body>
    <form action="/" method="POST" enctype="multipart/form-data">
      <input type="file" name="file" id="file" required />
      <input type="hidden" value="1" name="hidden">
      <input type="text" name="text">
      <input type="range" name="range">
      <button onclick="uploadFile();" type="button" id="upload">Upload</button>
    </form>
  </body>
</html>

继续阅读“文件上传进度和解析 Form Data”

由 PHP7 和 Nginx 配置导致的 502 错误解决办法

最近有点懒,中午过了一点半还没有做饭吃,所以接下来捯饬的事情肯定不是吃饱了撑。

WordPress 最近发布了 5.2 的版本,对 PHP 的最低要求是 5.6.20,我的是 5.6.18,毕竟是 2016 年安装的 PHP 了,所以我想更新到 PHP7,据说 PHP7 更快。我们从 php 上又一次看到了时间流逝的痕迹,这也意味着我的网站已经运行 3 年了。 继续阅读“由 PHP7 和 Nginx 配置导致的 502 错误解决办法”

在 svg 中学习点到直线(线段)的最短距离算法

怎么计算点到直线的最短距离?学过数学的都会觉得这个话题不难,然而真正在编程中实操起来,还是有点不对劲的。你会觉得小时候,我的数学打过满分呐,现在这些知识却全都忘记了。 继续阅读“在 svg 中学习点到直线(线段)的最短距离算法”