Vue&Php获取数据库数据

数据形式

如果不太熟悉,想要没有问题地将数据库中的数据递送到渲染层颇有挑战。用Php的fetch_all(1)方法实际上得到了一个关联数组的数组(此处1代表数组中的项是关联数组),利用json_encode()关联数组转换为JSON字符串,得到了一个JSON字符串数组

而前端的JavaScript的JSON.parse()方法支持将JSON字符串转为对象,也支持将JSON字符串数组转为对象数组,Vue就可以渲染了。

(更多…)

做MSSQL实验时的一些理解

数据库中有3张表,使用t-sql检索数据 s: sno学号, sname姓名, dept院系, age, sex
c: cno课程号, cname课程名, cpno, credit学分
sc: sno, cno, score

相关子查询的查询过程

select sno,cno,score from sc as sc1
where score<(select max(score) from sc as sc2 where sc2.sno=sc1.sno)
如果直接执行“select max(score) from sc”,我们将会得到sc表中score最大的那一行记录,但我们把s1与s2做sno相等的等值连接,情况有所不同。sc1.sno在查询过程中是变化的,我们可以认为数据库遍历了sc,sc1.sno等于遍历中的某一项的值。因此,这段代码将显示除了sno对应的最高成绩外的所有成绩。

当我们用EXISTS的时候我们在干嘛

select count(*) from sc where exists(select * from c where c.cno=sc.cno and cname='数据库原理')
go
select count(*) from sc,c where (c.cno=sc.cno and cname='数据库原理')
这两种查询得到的结果是相同的,我们可以认为exists仅仅用于表达嵌套子查询,增加了查询的可读性。

T-SQL拷贝表

create table s1(
sno varchar(10) not null,sname varchar(20),dept varchar(20),age int,sex char(4))
go
insert into s1(sno,sname,dept,age,sex) select sno,sname,dept,age,sex from s
有时候需要拷贝一份表,但我在网上查到了很多写法并不符合t-sql的语法,上面是可以使用的版本。我只找到了先按照表的结构新建表然后插入所有数据的办法。在sqlserver2017中可以正常运行,如果不能用,可能需要在末尾加where 1=1。

利用default约束插入数据

insert into s1(sno,sname,dept,age) values(125,'name','dept',16)
go
select * from s1
一开始我用了insert into s1 values(125,'name','dept',16)没有成功,好在及时悔悟,数据库管理系统并不能智能补缺。。。我们应该老老实实写上所有要加的属性。ps:default只在insert into起作用。

外键约束

alter table sc add constraint fkey foreign key(cno) references c(cno)'注释:sc表中cno的取值仅限于c表中cno的取值
A属性的取值范围是B属性已有取值的集合。或者说A中不同元素的集合属于B中不同元素的集合。

SQL自定义函数(存储过程)的语法

create proc calculate @n int '注释:@n int 是传入的参数,可以没有;create proc proc_name必须要有
as
declare @sum int,@i int '注释:声明变量,sql中变量前都加@
set @i=0 '为变量赋值
set @sum=1
while @i<@n'支持循环语句
begin
set @i=@i+1
set @sum=@sum*@i
end
print @sum
'ps:除了用set为变量赋值,也可以用select @variable= column_name from table_name where 条件
执行函数只需要'exec proc_name'

快速排序算法(C++)介绍和简易实现

快速排序算法,即一种递归地讲数组按一定大小标准分成两组,小的一组在前,大的一组排在后的算法。

有关快速排序算法的文章和图解,网络上已经很多了,但阅读理解起来可能稍有困难,接下来我们将看到更容易理解的快速排序算法。

示例:以数组的首位作为基准(pivot),将小于ta的数置于ta的左边,大于ta的数在右边,左边只有1个元素,排序完成,而右边有4个数,那么把这4个数作为新的要排序的(抽象的)数组,重复上面的过程,最终基准所在的(抽象的)数组只有基准一个元素(如下图第二排的“2”),排序完成。

快速排序算法示例

快速排序的复杂度

快排过程中需要移动元素的位置,很大程度上决定了时间复杂度。如果一个数组由大到小排列,而选取首位(最大数)为基准,则每一个元素都需要移动,而每一次移动的过程:对n个元素,考虑一般情况,分割一次数组(即小的排左边的过程)比较和交换元素的次数和n有关(虽然有的时候不用交换,但一定会比较);而快排有一颗递归树,在数字比较随机,树比较均匀的情况下,树的高度近似logn,而树的每一层都有n个元素参与partition(数组分割成抽象数组后,多个抽象数组partition,因为partition的复杂度与n的一次方相关,在估测复杂度时,可以认为每一层都有n个元素参与一次partition),随机情况的复杂度即为n*logn。

最坏情况这棵树只沿着一颗子树延伸,树的高度为n,每一层仍有n个元素参与partition,复杂度为n*n。看一下数字从大到小排列的情况,例如100到1,首次partition会进行99次比较,最后一次partition进行1次比较,并且递归也会进行99次,从等差数列的公式也可以看出来它与n的平方相关。

复杂度的数学证明:

图片来自:https://blog.csdn.net/matrix_laboratory/article/details/9342415

快速排序的代码(便于理解过程的版本,partition时移动数据,复杂度高)

#include <iostream>
using namespace std;

void QuickSort(int arr[],int start,int end){//递归的时候,start和end都相对于整个arr
    if(start>=end){return;}
    int temp=start;//保留start初始值
    int pivot=arr[start];//以数组或分割后的抽象数组的第一个元素作为基准(pivot)
    for(int i=start+1;i<=end;i++){//遍历arr[start]右边的元素
        if(arr[i]<pivot){//当arr[i]比基准小
            arr[start]=arr[i];//小的元素放到基准所在的位置
            for(int j=i;j>start;j--){//遍历arr[start]到arr[i],全体右移(arr[start]已经放了新的元素)
                arr[j]=arr[j-1];//右移
            }
            arr[++start]=pivot;//由于start和i项交换,start+1项的值需要修正,完成交换后基准右移,所以start也要++
        }
    }//完成了一次左右分组(排序)
    
    QuickSort(arr, temp, start-1);//对0号到start-1号元素排序,共有start个元素
    QuickSort(arr, start+1, end);//对右边的元素排序
}

int main(int argc, const char * argv[]) {
    int arr[]={3,4,2,7,5,8,6,1};//8个元素组成的的乱序数组
    QuickSort(arr,0,7);//8个元素即0号到7号
    for(int i=0;i<8;i++){
        cout<<arr[i]<<endl;
    }
    
    return 0;
}

快速排序的代码(普通版本)

#include <iostream>
using namespace std;

int Partition(int arr[],int &start,int &end){
    int pos=start;//(pos-start)用来记录小于等于arr[start](基准)的数的个数,arr[start+1]到arr[pos]都小于基准
    for(int i=start+1;i<=end;i++){//遍历基准以后的元素
        if(arr[i]<arr[start]){//当某一项小于基准
            if(arr[i]!=arr[++pos]){//如果任何一个大于基准的数后面所有元素中都没有小于x基准的数(即基准后的元素,前一部分全部小于基准,后一部分全部大于基准),则arr[i]==arr[pos],不需要交换;否则需要交换
                swap(arr[i], arr[pos]);
            }
        }
    }
    swap(arr[start], arr[pos]);//基准的位置开始没有移动,现在把基准的位置交换到小于基准的抽象数组的最右端,实现对数组的分割
    return pos;
}

void QuickSort(int arr[],int start,int end){//递归的时候,start和end都相对于整个arr
    if(start>=end){return;}//对应多种情况,pos可能等于start,pos-1为负,这种情况没有数小于基准,也不需要排序,对应start==end+1;pos等于start+1时,只有一个数比基准小,并且已经z位于基准左边,也不需要排序,对应start==end
    int pos=Partition(arr, start, end);//对数组或抽象数组按基准排列,基准左边的数小于基准,右边大于基准
    QuickSort(arr, start, pos-1);//对0号到start-1号元素排序,共有start个元素
    QuickSort(arr, pos+1, end);//对右边的元素排序
}

int main(int argc, const char * argv[]) {
    int arr[]={3,4,2,7,5,8,6,1};//8个元素组成的的乱序数组
    QuickSort(arr,0,7);//8个元素即0号到7号
    for(int i=0;i<8;i++){
        cout<<arr[i]<<endl;
    }
    return 0;
}

两个指针的快速排序&&Partition的优化

待补充

参考资料:

1.《算法导论》第7章:快速排序

2.快速排序的时间复杂度nlogn是如何推导的??

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1q1xzkj9mydbq

[转载]root用户以nobody身份运行命令

我用搜索引擎找了很久用nobody身份运行程序的方法,因为我用aria2下载完成的文件目录权限是755,其他没有以root权限运行的程序无法访问。

原文链接:http://programmerfamily.com/blog/su.html

root用户以nobody身份运行命令

有时mount的磁盘使用root操作时无权限,需要使用指定的用户如(nobody)执行,

su -m nobody -c "shellcommand"

su -m nobody -c " rm -rf /var/www/http/www.oppo.cn/data/attachment/forum/201510/07/130152jvtchg3tzolhn80n*"

C++/Python 近期问题总结201804

以下问题都很入门,自用?以为会整理很多的,果然写不下去了。

1.python编译时遇到syntax error或者与indent有关的错误。

出现如上提示的确是因为缩进出现了问题,但是在某些编辑器中(尤其是在线编辑器),看似对齐,实际上却没有对齐。因此,下一次遇到这类问题,应当把代码复制到另一个编辑器中,以便于检查。

(更多…)