分类 默认分类 下的文章

在 Flutter ConstraintLayout 中用到了计数排序,众所周知,计数排序在某些场景下可以说是最快的排序算法,它有时甚至不需要元素间两两比较。但它有个最大的问题,它不通用!只适合对小范围的整数进行排序。

于是这段时间我一直在寻思着能不能改进它,让它通用呢,终于今天灵感爆发,我做到了!

因为我姓陈,所以我把它命名为 Chen Sort。看看它的性能表现吧:

空间复杂度恒为:O(n),时间复杂度为 O(nlogn),在最好的情况下,不需要元素间两两比较就能排好序。且它是稳定的。

性能测试

众所周知全世界公认的最快的通用排序算法是快排,我们来和它做下性能对比吧,基准如下:

随机生成若干个范围为 [1,4294967296] 的正整数,使用 Chen Sort 和快排分别排序。

这里没有生成负数,负数性能会下降一些,但仍比快排快很多。

100 个随机数

100_compare.png

平均快了 10%。

10000 个随机数

10000_compare.png

平均快了 60% 多。

100000 随机数

100000_compare.png

平均快了 80% 多。

1000000 随机数

1000000_compare.png

平均快了 20% 左右。

目前的实现语言是 Dart,晚点用 Java 实现一下,并和 Tim Sort 做个对比。应该也会快很多。
代码已开源到 GitHub,目前放在 Flutter ConstraintLayout 的 example/chen_sort.dart 中,后续再把它抽出来。欢迎多多转发。

原文链接:https://www.jianshu.com/p/2e6e856bb32a

interface StaticMethodInterface { // 测试接口
int method(int a, int b); // 抽象方法
}
public class StaticMethodDemo {
static int add(int x, int y) { // 静态方法,返回两个参数相加的结果
return x + y; //返回相加结果
}

public static void main(String[] args) {
    StaticMethodInterface sm = StaticMethodDemo::add;       //引用StaticMethodDemo类的静态方法
    int result = sm.method(15, 16);                     //直接调用接口方法获取结果
    System.out.println("接口方法结果:" + result);             //输出结果
}

}

原文链接:https://www.jianshu.com/p/aa5c4a8e1f45

复杂热图.png

从这个系列开始,师兄就带着大家从各大顶级期刊中的Figuer入手,从仿照别人的作图风格到最后实现自己游刃有余的套用在自己的分析数据上!这一系列绝对是高质量!还不赶紧点赞+在看,学起来!

参考文献

本期分享的是昨天更新的Nature Medicine上面那篇文章中的一个复杂热图!

这个热图可以说是高端大气上档次!配色自然不必多说,非常有特色的就是单元格中的注释,"+"、""、"#"的添加*,让这个图的解释性更强,也更加美观!再配上右边的柱状图,简直是好看到不行!

那么这么好的图!你难道不想学学怎么画的吗?本节师兄就带你解锁热图大师级R包 -- ComplexHeatmap!

示例数据和代码获取

跟着Nature Medicine学作图 -- 复杂热图

读图

原图

这张图通过计算相关性矩阵,绘制相关性热图,图中的"+"表示p值小于0.05, "*"表示p值小于0.01,"#"表示是否为之前识别出的MLGs,是则显示。

这个图的男单在于单元格注释的添加,图例的调整,以及坐标轴颜色和字体的修改,用到的R包是ComplexHeatmap,赶紧点赞,在看!学起来吧!

本教程用到的数据为模拟数据,并无实际意义!

结果展示

效果展示

示例数据和代码获取

跟着Nature Medicine学作图 -- 复杂热图

以上就是本期的全部内容啦!欢迎点赞,点在看!师兄会尽快更新哦!制作不易,你的打赏将成为师兄继续更新的十足动力!

往期文章

  1. 跟着Nature Medicine学作图--箱线图+散点图
  2. 跟着Nature Communications学作图--渐变火山图
  3. 跟着Nature Communications学作图--气泡图+相关性热图
  4. 跟着Nature Communications学作图 -- 复杂提琴图

原文链接:https://www.jianshu.com/p/21a00cb7291c

1、直接dubug到想要到达的位置,直接点击旁边的数字即可。

image.png

2、debug后不想重新启动,想重新进入再执行一次debug,可以使用drop frame来删除当前栈,跳到之前的栈再一次进入这个栈。

  • 注意这个是以栈为单位,即一个个方法来来回滚的,因此只能跳到上一个方法。
image.png

3、条件断点,右击两次断点红点,输入断点执行的等式就可以在满足条件的时候才进入该断点。

image.png

4、固定表达式追踪,可以点击加号添加想要跟踪的固定表达是,这样我们就不需要每次都打开对象去check对象内想知道的值。

image.png

<img src="https://upload-images.jianshu.io/upload_images/14404316-4f0877bf0d3e190c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" />

5、断点开关,可以选择暂时不进入的断点,方便调试。

image.png

6、动态修改形参的值,通过evaluate expression来动态临时修改形参的值来进行变量修改,满足我们特定变量的调试。

  • 注意在形参上修改才有效。
image.png
image.png
image.png

7、多线程调试,选择suspend为Thread就可以让当前线程断点到改位置。

image.png

image.png

8、源码debug调试,右击两次源码的断点进行源码位置代码的输出,辅助调试。

  • 注意双亲委派的模式下,优先加载JDK包下的源码,再加载本工程代码,再加载第三方如框架包。
  • 因此使用在本工程下创建第三方jar包路径下的代码类可以覆盖第三方类的加载。
  • 但是对于JDK源码则做不到,因为JDK源码是第一顺位加载的,只能在debug的时候加上这种调试输出。
image.png

参考

极海大佬的dubug分享

原文链接:https://www.jianshu.com/p/60cb31a459d8

在使用C++时,编译项目时偶尔会发生链接,这些错误很多时候是偶发的,可能再编一次,或者换个模式,换个参数,就没有编译错误了,但之后可能还会出现。由于是在编译阶段,问题不容易排查。这样的错误有可能就是静态变量的初始化问题。

  • 简单概括:当静态变量的初始化过程中,需要其他静态变量的值时,就有可能产生不确定的链接错误。
  • 主要原因:C++不固定静态变量的初始化顺序,在初始化静态变量时,如果你需要其他静态变量的值,但这个值又没有初始化,问题就发生了。
  • 解决方案:
    1. 尽量不要在静态初始化时引入其他静态变量,尤其避免循环依赖。
    2. 将静态变量,放到函数里面去,即:

    A& variable_name(){
      static A variable = ...;
      return variable;
    }
    

    每次想访问这个静态变量时,改为用variable_name()来进行访问,这个函数也没必要是成员函数,跟这个类一起放到头文件里就可以了(内联inline)。在函数内的局部静态变量第一次访问是初始化,之后自动再调用函数自动略过初始化语句。
    1. 为C++入口的_init()函数提供自定义实现,这个函数负责初始化静态变量,在这个函数内部人工确定顺序。(一般非必要不使用)

好的,接下来我们深入剖析下这个问题:

  • C语言没有这样的链接错误:C语言可以很简单的处理初始化变量,无论是基本类型还是结构体,在编译阶段就可以将初始化值放入.data节,自然就不存在这样的问题。C++的对象是由构造函数来构建的,编译时不执行代码,因此无法确定具体值,只能放在运行时完成。
  • 静态变量的初始化如果不牵涉其他任何自定义类型则不会出现问题:因为不会出现顺序问题,所以可以按正常语法初始化。
  • 那些需要其他静态变量的值做初始化的静态变量,最好按照方案2重写避免链接问题。

顺便说一句,对于非静态变量,比如类中的成员变量,在构造函数中,尽量以初始化列表的方式初始化,即

A(int _a, double _b, B & _c)
: a(_a),b(_b),c(_c),d()
{}

如果在函数体内执行,实际上是用默认构造函数初始化了一次,又赋值了一次。
而且,如果是常量对象和引用对象,则必须如此初始化!!

  • 还有一个值得注意的点:类内成员的初始化顺序,是按照他们在头文件中的排列顺序决定的,和构造函数的初始化列表无关。

参考资料:

  • 《Effective C++》第三版,条款04
  • 《高级C/C++编译技术》:第6章

原文链接:https://www.jianshu.com/p/650229abad34