精华内容
下载资源
问答
  • 行列优先原则在计算机领域的应用主要如下。行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式。因为在内存使用上,程序访问的内存地址之间连续性越好,程序的访问效率就越高;相应地,程序...
  • 摘要 本文主要探讨的是“行优先”原则和“列优先”原则的问题。 1. 背景 首先了解“行优先”和“列优先”...行列优先原则在计算机领域的应用主要如下。行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存

    摘要

    本文主要探讨的是“行优先”原则和“列优先”原则的问题。


    1. 背景

    首先了解“行优先”和“列优先”的知识,这两种方式在数学上的直观描述如下,给定如下矩阵:

    根据行优先的原则,其排序方式为


    根据列优先的原则,其排序方式为



    2. 计算机领域的应用

    行列优先原则在计算机领域的应用主要如下。行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式。因为在内存使用上,程序访问的内存地址之间连续性越好,程序的访问效率就越高;相应地,程序访问的内存地址之间连续性越差。所以,我们应该尽量在行优先机制的编译器,比如C/C++,CUDA等等上,采用行优先的数据存储方式;在列优先机制的编译器,比如Fortune, Matlab等等上,采用列优先的数据存储方式。但这种思想渗透到编程中之后,代码的质量就会提高一个档次。


    3. 以矩阵计算为例(Matlab编译器下测试)

    % data
    A = [ 1 1
          2 2
          3 3 
          4 4
          5 5
          6 6
          7 7
          8 8
          9 9];
    B = [ 1 2 3 4 5 6 7 8 9
          1 2 3 4 5 6 7 8 9];
    C = zeros(9,9);
    
    % The method of matrix multiplication in Matlab
    tic 
    C = A*B;
    toc
    
    
    % Our impletation method of matrix multiplication
    tic
    for ra = 1:9 % raws of the matrix A
        for cb = 1:9 % columns of the matrix B
            for len = 1:2 
                C(ra,cb) = A(ra,len)*B(len,cb)+C(ra,cb); 
            end
        end
    end
    toc
    
    
    % Optimal method 1 
    tic
    for cb = 1:9 % columns of the matrix B
        for ra = 1:9 % raws of the matrix A
            for len = 1:2 
                C(ra,cb) = A(ra,len)*B(len,cb)+C(ra,cb); 
            end
        end
    end
    toc
    
    
    % Advanced optimal method 2
    A = A'; % you can also directly given A = [ 1 2 3 4 5 6 7 8 9 
            %                                   1 2 3 4 5 6 7 8 9];
    B = [ 1 2 3 4 5 6 7 8 9
          1 2 3 4 5 6 7 8 9];
    tic
    for i = 1:9 % columns of the matrix A
        for j = 1:9 % columns of the matrix B
            for len = 1:2
                C(i,j) = A(len,i)*B(len,j)+C(i,j);
            end
        end
    end         
    toc
    
    
    

    4. 测试和分析


    测试结果如上图所示,第一个时间为Matlab自带的乘法运算,第二个为我们原始实现的乘法计算,第三个为循环中行列变换(适应列优先编译器的处理)。

    最重要的是第四个是本人原创的矩阵乘法方法,简单地说就是将A矩阵转置,然后设计相应的算法实现矩阵乘运算。在这个点上,希望在理解原理的基础上能给读者一些启发。在本例中,这样做效率最高,原因其一是本例中原始数据结构上适合我这样处理;原因其二是这样做的目的是使得任何一个子乘法的处理上,两乘数所在的内存空间上都是连续,而不仅仅是一个连续(注意:这是本文的核心,读者理解透了一定会很有收获,认真看我给出的程序实现。这是核心,不懂的可以交流思想)!

    另外,本文中我给出的这个方法是矩阵乘法里面最优的方法,至少数学逻辑上是这样。之所以Matlab自带的乘法计算之所以性能还不错,是因为Matlab自带的运算都是经过优化的,包括硬件加速,系统加速等自己设计的应用很能调用加速方法。


    展开全文
  • 这道题目考察的知识点是MySQL组合索引(复合索引)的最左优先原则。 最左前缀匹配原则 在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,组合索引的第一个...

    MySQL数据库,game_order表表结构如下,下面哪些sql能使用到索引?

    这道题目考察的知识点是MySQL组合索引(复合索引)的最左优先原则。

    最左前缀匹配原则

    在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到,示例:
    对列col1、列col2和列col3建一个联合索引:

    KEY test_col1_col2_col3 on test(col1,col2,col3);

    联合索引 test_col1_col2_col3 实际建立了(col1)、(col1,col2)、(col,col2,col3)三个索引。

    上面这个查询语句执行时会依照最左前缀匹配原则,检索时会使用索引(col1,col2)进行数据匹配。

    注意

    索引的字段可以是任意顺序的,如:

    SELECT * FROM test WHERE col1=“1” AND clo2=“2”
    SELECT * FROM test WHERE col2=“2” AND clo1=“1”

    这两个查询语句都会用到索引(col1,col2),mysql创建联合索引的规则是首先会对联合合索引的最左边的,也就是第一个字段col1的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个字段col2进行排序。其实就相当于实现了类似 order by col1 col2这样一种排序规则。

    所以题目会创建三个索引(plat_order_id)、(plat_order_id与plat_game_id的组合索引)、(plat_order_id、plat_game_id与plat_id的组合索引)。根据最左匹配原则,where语句必须要有plat_order_id才能调用索引(如果没有plat_order_id字段那么一个索引也调用不到),如果同时出现plat_order_id与plat_game_id则会调用两者的组合索引,如果同时出现三者则调用三者的组合索引。

    思考

    对于联合索引(col1,col2,col3),查询语句SELECT * FROM test WHERE col2=2;是否能够触发索引?

    EXPLAIN SELECT * FROM test WHERE col2=2;
    EXPLAIN SELECT * FROM test WHERE col1=1;

    借助mysql查询优化器explain,explain会纠正sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划,观察explain中上述两个sql语句结果的type字段。查询中分别是:

    • type: index
    • type: ref

    index:这种类型表示mysql会对整个该索引进行扫描。要想用到这种类型的索引,对这个索引并无特别要求,只要是索引,或者某个联合索引的一部分,mysql都可能会采用index类型的方式扫描。但是呢,缺点是效率不高,mysql会从索引中的第一个数据一个个的查找到最后一个数据,直到找到符合判断条件的某个索引。所以,上述语句会触发索引。
    ref:这种类型表示mysql会根据特定的算法快速查找到某个符合条件的索引,而不是会对索引中每一个数据都进行一一的扫描判断,也就是所谓平常理解的使用索引查询会更快的取出数据。而要想实现这种查找,索引却是有要求的,要实现这种能快速查找的算法,索引就要满足特定的数据结构。简单说,也就是索引字段的数据必须是有序的,才能实现这种类型的查找,才能利用到索引。

    为什么要使用联合索引

    减少开销。建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销!

    覆盖索引。对联合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。

    效率高。索引列越多,通过索引筛选出的数据越少。有1000W条数据的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W10%=100w条数据,然后再回表从100w条数据中找到符合col2=2 and col3= 3的数据,然后再排序,再分页;如果是联合索引,通过索引筛选出1000w10% 10% *10%=1w,效率提升可想而知!

    转载于:https://www.cnblogs.com/CKhomepage/p/10613618.html

    展开全文
  • 优先与列优先的循环方式来计算 这些单元格的总 和,看看性能的差距,我们直接贴出源码: package com.operation; import java.util.Date; import java.util.Random;  /** * 行优先与列优先的性能差距测试 * @...

    定义一个10240*10240的byte数组,分别采用行

    优先与列优先的循环方式来计算 这些单元格的总

    和,看看性能的差距,我们直接贴出源码:


    import java.util.Date;
    import java.util.Random;
    
    public class TestOperation{
    	/**
    	 * 随机初始化数据
    	 * @return
    	 */
    	public static byte [] [] init(){
    		byte [] [] b =new byte[10240][10240];
    		for(int i=0;i<10240;i++){
    			for(int k =0; k<10240;k++){
    				Random d = new Random();
    				int x =d.nextInt(128)-1;
    				b[i][k]=Byte.parseByte(String.valueOf(x));
    			}
    		}
    		return b;
    	}
    	/**
    	 * 行优先
    	 * @param args
    	 */
    	public static void getTimeByProcessByHang(byte [] [] b){
    		Long currentStrarTime =new Date().getTime();
    		System.out.println("Hang:currentStrarTime:"+currentStrarTime);;
    		Long sum=0l;
    		for(int i=0;i<b.length;i++){
    			for(int k=0;k<b[0].length;k++){
    				sum += b[i][k];
    			}
    		}
    		System.out.println("数据总和:"+sum);
    		Long currentEndTime=new Date().getTime();
    		System.out.println("Hang:currentEndTime:"+currentEndTime);;
    		Long cha = currentEndTime - currentStrarTime;
    		System.out.println("Hang:ChaTime:"+cha);
    	}
    	/**
    	 * 列优先
    	 * @param b
    	 */
    	public static void getTimeByProcessByLie(byte [] [] b){
    		Long currentStrarTime =new Date().getTime();
    		System.out.println("Lie:currentStrarTime:"+currentStrarTime);;
    		Long sum=0l;
    		for(int i=0;i<b.length;i++){
    			for(int k=0;k<b[0].length;k++){
    				sum += b[k][i];
    			}
    		}
    		System.out.println("数据总和:"+sum);
    		Long currentEndTime=new Date().getTime();
    		System.out.println("Lie:currentEndTime:"+currentEndTime);;
    		Long cha = currentEndTime - currentStrarTime;
    		System.out.println("Lie:ChaTime:"+cha);
    	}
    	
    	
    	
    	public static void main(String[] args) {
    		byte [] []b =init();
    		getTimeByProcessByHang(b);
    		getTimeByProcessByLie(b);
    
    	}
    
    }
    

     
    


    这里我们测试到:

    行优先:383ms。

    列优先:1453ms.



    行列优先原则在计算机领域的应用主要如下。行优先或

    者列优先没有好坏,但其直接涉及到对内存中数据的最

    佳存储访问方式。因为在内存使用上,程序访问的内存

    地址之间连续性越好,程序的访问效率就越高;相应地,

    程序访问的内存地址之间连续性越差。所以,我们应该

    尽量在行优先机制的编译器,比如C/C++CUDA等等

    上,采用行优先的数据存储方式;在列优先机制的编译

    器,比如Fortune,Matlab等等上,采用列优先的数据存

    储方式。但这种思想渗透到编程中之后,代码的质量就

    会提高一个档次



    展开全文
  • 采用符号优先法,设立2个栈,一个数据栈,一个符号栈,另外还有出,符号优先表,采用直接读取数字的方式。
  • 最近用matlab, 发现matlab偏爱列,查了一下资料,发现matlab和Fortran一样,都是列优先的. 与之相反的是C++, 是行优先的. 下面写个小程序来看看matlab是如何偏爱列的: clear clc a = ones(3, 5) sum(a) % 每...

           最近用matlab, 发现matlab偏爱列,查了一下资料,发现matlab和Fortran一样,都是列优先的. 与之相反的是C++, 是行优先的. 下面写个小程序来看看matlab是如何偏爱列的:

    clear
    clc
    
    a = ones(3, 5)
    sum(a) % 每一列的元素相加

           结果为:

    a =

         1     1     1     1     1
         1     1     1     1     1
         1     1     1     1     1


    ans =

         3     3     3     3     3

     

    展开全文
  • 输入法编程--词频调整原则--发音长度优先 作者Attilax , EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/attilax 准备打个 "提升" ,编码是 "tishen sp".. 江打的...
  • MySQL最左匹配原则,道儿上兄弟都得知道的原则

    千次阅读 多人点赞 2020-09-11 19:31:00
    目录一、最左匹配原则的原理二、违背最左原则导致索引失效的情况三、查询优化器偷偷干了哪些事儿四、需要你mark的知识点1、如何通过有序索引排序,避免冗余执行order by2、like 语句的索引问题3、不要在上进行运算...
  • 复合索引建立原则: 值选择性好的放在最前面 所谓值选择性好,指的是该中值大部分不一样,只有少部分重复,我们就称之为值选择性好,如主键,唯一键等. 表CHANNEL_CARD中字段lan_id只有11个不同值,serv_id基本都...
  • Java 优先队列

    千次阅读 2016-05-15 09:29:41
    Java PriorityQueue优先队列是一种重要的数据结构,其利用的是小/大顶堆来实现的。Java中提供了PriorityQueue,PriorityQueue是基于小顶堆实现的无界优先队列,这个优先队列中的元素可以默认自然排序(实现了...
  • Fortran和 C语言中数组的存储方式

    千次阅读 2012-10-21 12:11:31
    Fortran和matlab语言中的多维数组存储方式为列优先原则,内循环最好是列循环;而c语言中的多维数组存储方式为行优先原则,内循环最好是行循环。下面介绍何为行优先存储,何为列优先存储。  例如二维数组Amn ...
  • DFS(深度优先搜索算法)

    万次阅读 多人点赞 2018-10-07 16:32:43
    深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到...
  • Fortran和matlab语言中的多维数组存储方式为列优先原则,内循环最好是列循环;而c语言中的多维数组存储方式为行优先原则,内循环最好是行循环。下面介绍何为行优先存储,何为列优先存储。 例如二维数组Amn (1)行...
  • 数据结构实践——迷宫问题之图深度优先遍历解法

    万次阅读 多人点赞 2015-11-08 15:36:59
    【项目 - 迷宫问题之图深度优先遍历解法】  设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。  (1)建立迷宫对应的图数据结构,并建立其邻接表表示。  (2)采用深度优先遍历的思路设计算法,输出...
  • 联合索引的最左匹配为原则

    千次阅读 2018-09-12 23:26:52
    在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例: 对col1、col2和col3建一个联合索引 1 KEY test_col1_col2_col3 on test(col1,...
  • 深度优先算法 /***********************************/ 和树的遍历相似,若从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph)。图的遍历算法是求解图的连通性问题、...
  • URL命名原则

    千次阅读 2017-03-01 13:29:12
    1. RESTful优先原则 1.1. URL命名原则 1、 URL请求采用小写字母,数字,部分特殊符号(非制表符)组成。 2、 URL请求中不采用大小写混合的驼峰命名方式,尽量采用全小写单词,如果需要连接多个单词,则...
  • SQL索引建立原则和使用

    万次阅读 多人点赞 2017-12-01 18:52:21
    前言 SQL索引有两种,聚集索引和非聚集索引 聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续 字典的拼音查询法就是聚集索引,字典的部首查询就是...建立索引的原则: ...
  • 一、核心原则 1、尽量不在数据库做运算 俗话说:别让脚趾头想事情,那是脑瓜子的职责。作为数据库开发人员,我们应该让数据库多做她所擅长的事情。尽量不在数据库做运算,复杂运算移到程序端CPU,尽可能简单应用...
  • 顶点vi的入度是vi所在的元素之和,出度是所在行的元素之和 矩阵的值也可以是边的权重。 typedef struct{ VertexType vexes[ MAX ]; //顶点表 EdgeType arc[ MAX ][ MAX ]; //邻接矩阵 int ...
  • 云原生应用的十大设计原则

    万次阅读 2021-03-10 22:19:12
    云应用程序的十大设计原则 自我修复设计 实现全面冗余 尽量减少协调 横向扩展设计 通过分区解决限制 运营设计 使用托管服务 使用最佳的数据存储完成作业 演变设计 根据业务需求构建 越来越多的企业选择...
  • 每日一面 - MySQL 大表添加一

    万次阅读 2021-01-20 09:24:20
    以前老版本 MySQL 添加一的方式: ALTER TABLE 你的表 ADD COLUMN 新 char(128); 会造成锁表,简易过程如下: 新建一个和 Table1 完全同构的 Table2 对表 Table1 加写锁 在表 Table2 上执行 ALTE.
  • 架构设计的原则

    千次阅读 2016-12-07 20:39:32
    (9) 优先选择水平扩展,无状态是水平扩展的前提,只要能做到无状态的服务基本都具备一定的水平扩展能力;一般情况下,服务的水平扩展比较容易,垂直扩展则涉及到分割业务、数据,实现起来相对复杂; (10) 设计...
  • 主要讨论MySQL选择索引时单列单列索引和多索引使用,以及多索引的最左前缀原则,需要的朋友可以参考下
  • css多布局column

    千次阅读 2019-08-08 18:08:25
    下面由我用一个小案例来讲解一下 多布局—column column-count: 3; ----设置数(此处数为3) column-rule: dashed 3px red; -----添加间隙样式(与边框样式添加一样,此处宽度为3px的红色虚线) column-gap: ...
  • 深入浅析Mysql联合索引原理 之 最左匹配原则

    万次阅读 多人点赞 2019-04-28 11:38:46
    前言 之前在网上看到过很多关于mysql联合...在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配, 示例: CREATE TABLE `student` ( `Id` int(11) unsign...
  • zoj3284Matrix Processing(二维树状数组)

    千次阅读 2014-01-12 16:44:33
    op = 1:按列优先原则从(x1,y1)到(x2,y2)所有元素都加上k。 op = 2:查询(x,y)处元素值。 题目分析:矩阵不大,但是查询很多。暴力会超时。于是高兴的写了一个二维线段树,结果华丽丽的TLE了。然后又不断调整姿势...
  • 在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例: 对col1、col2和col3建一个联合索引 KEY test_col1_col2_col3 on test(col1,col2,col3); 联合...
  • 建立联合索引时会遵循最左匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配 例如: 为user表中的name、address、phone添加联合索引 ALTER TABLE user ADD INDEX index_three(name,address,phone); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,550
精华内容 20,220
关键字:

列优先原则