Linux环境编程之文件I/O(七):目录文件及操作

什么是数据结构?

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

还有一些概念(数据、数据元素、数据项、数据对象、数据类型...)

传统上,我们把数据结构分为逻辑结构和物理结构。

逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题。

物理结构:是指数据的逻辑结构在计算机中的存储形式。

逻辑结构分为以下四种:

1.集合:集合结构中的数据元素除了同属于一个集合外,之间没有任何关系。

2.线性结构:元素之间一对一。

3.树形结构:一对多。

4.图形结构:多对多。

物理结构分为以下两种:

1.顺序存储结构:数据元素存放在地址连续的存储单元里,其数据间的逻辑关系与物理关系一致。

2.链式存储结构:数据元素放在任意的存储单元里,可以连续也可以不连续。

谈谈算法

程序=数据结构+算法

算法的五个基本特征:输入、输出、有穷性、确定性和可行性。

<1>算法具有零个或多个输入。

<2>算法至少有一个或多个输出。

<3>指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。

<4>算法的每一个步骤都具有确定的含义,不会出现二义性。

<5>算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成

设计要求:

<1>正确性

<2>可读性

<3>健壮性

<4>时间效率高

<5>存储量低。

因此在度量过程中产生了两个复杂度,分别为时间复杂度空间复杂度

时间复杂度

算法时间复杂度的定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。

算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。

它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。

计算方法:

<1>用常数1取代运行时间中的所有加法常数。

<2>在修改后的运行次数函数中,只保留最高阶项。

<3>如果最高阶项存在且不是1,则去除与这个项相乘的常数,得到的最后结果就是大O阶。

举例:

(1)

int a = 1;

int b = 2;

int c = 3;

纯加法常数 执行时间为1+1+1 所以时间复杂度记为O(1)

(2)

int i , n = 100, sum = 0;
     for( i=0; i < n; i++ )
{
     sum = sum + i;
} 

执行时间为 O(1) + O(n) //for会循环执行n次所以时间复杂度为O(n)

(3)

int i, j, n = 100;

for( i=0; i < n; i++ )
{
    for( j=0; j < n; j++ )
    {
        printf(“I love FishC.comn”);
    }
} 

外层执行O(n)次,内层执行O(n)因为时间复杂度为O(n^2)

(4)

int i, j, n = 100;

for( i=0; i < n; i++ )
{
    for( j=i; j < n; j++ )
    {
        printf(“I love FishC.comn”);
    }
} 

由于当i=0时,内循环执行了n次,当i=1时,内循环则执行n-1次……

当i=n-1时,内循环执行1次,所以总的执行次数应该是:n+(n-1)+(n-2)+…+1 = n(n+1)/2

取最高次幂所以时间复杂度为O(n^2)

(5)

int i = 1, n = 100;

while( i < n )
{
    i = i * 2;
}

由于每次i*2之后,就举例n更近一步,假设有x个2相乘后大于或等于n,则会退出循环。

于是由2^x = n得到x = log(2)n,所以这个循环的时间复杂度为O(logn)。

最坏情况与平均情况

我们查找一个有n个随机数字数组中的某个数字,最好的情况是第一个数字就是,

那么算法的时间复杂度为O(1),但也有可能这个数字就在最后一个位置,那么时间复杂度为O(n)。

平均运行时间是期望的运行时间,最坏运行时间是一种保证。

在应用中,这是一种最重要的需求,通常除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

空间复杂度

算法的空间复杂度通知计算方法所需的存储空间实现,算法的空间复杂度的计算公式记作:S(n)=O(f(n))其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

参考<<大话数据结构>>

Linux环境编程之文件I/O(七):目录文件及操作,布布扣,bubuko.com

时间: 2024-08-08 22:10:02

Linux环境编程之文件I/O(七):目录文件及操作的相关文章

Linux环境编程之文件I/O(六):文件属性

引言: 在Linux中使用ls -l filename命令查看filename的属性时,会列出文件的9种属性,例如:ls -l /etc/fstab -rw-r--r-- 1 root root 1102 2013-10-12 02:33 /etc/fstab 从左到右分别是类型与权限.文件个数.该文件或目录的拥有者.所属的组.文件大小.创建时间.文件名 以上这些文件属性的信息,都存放在一个stat的结构体中.下面就来分析一下这个结构体. 要想查看一个文件的stat结构体,可以通过stat类函数

Linux环境编程之进程(七):守护进程

守护进程也是一种进程,它由如下特性: 1.生存期较长,在系统自举时启动,仅在系统关闭时终止. 2.没有控制终端,在后台运行. 系统中有很多守护进程,它们执行日常事务活动.如日志进程syslogd.web服务器httpd.邮件服务器sendmail和数据块服务器mysqld等.大多数守护进程都是以超级用户(用户ID为0)特权运行.没有一个守护进程具有控制终端,其终端设置为问号(?),终端前台进程组ID设置为-1.内核守护进程以无控制终端方式启动.用户层守护进程缺少控制终端可能是守护进程调用了set

Linux环境编程之文件I/O(四):文件I/O的数据结构

(一) Linux系统支持不同进程间共享打开的文件.内核使用三种数据结构表示打开的文件:进程表项.文件表项.v节点表. 1.进程表项:每个进程在进程表中都有一个记录项,记录项中年包含有一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项.与每个文件描述符相关联的是: a.文件描述符标志 b.指向一个文件表项的指针 2.内核为所有打开文件维持一张文件表.每个文件表项包含: a.文件状态标志,如读写.添加.同步和非阻塞等. b.当前文件偏移量 c.指向该文件v节点表项的指针 3.每个打开的文

Linux环境编程之文件I/O(五):fcntl函数

引言: 对于一个普通的文件,我们可以想到的对它的操作有,读取文件的内容.写数据到文件中,这些都是前面提到的read.write函数的作用.除此之外,还可以获取文件的其他性质,并对这些性质进行修改,比如文件的描述符.文件描述符标记.文件状态标志等等.这些对文件性质的修改就由fcntl函数完成. 函数介绍: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); 参数: fd:

Linux环境编程之文件I/O(二):文件的打开与关闭

(一) Linux系统中,要对一个文件进行任何操作,必须首先获得它的文件描述符.而获得文件描述符的方式就是利用open/creat函数打开/创建该文件,open/creat函数返回文件描述符. #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, in

Linux环境编程之文件I/O(一):文件描述符

(一) 首先,对于内核来讲,它是利用"文件描述符"来访问文件的.文件描述符一般是一个非负的整数.当我们用open打开已有的文件或者用creat创建新的文件时,都会返回一个文件描述符.有了文件描述符之后,我们就可以利用该文件描述进行文件的读写,即read.write系统调用都需要文件描述符fd(file descriptor)作为其参数.从以上描述可以看出,当我们想要用read.write等系统调用对文件进行读写等操作之前,必须用open或creat系统调用得到文件的描述符. 一般Uni

Linux环境编程之文件I/O(三):文件的读写

(一) 当我们打开了一个文件后,一般对文件的操作就是读写.读写函数分别是read.write. #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 参数: fd:利用open.creat得到的文件描述符. buf:buf是void *类型,用于表示通用指针,此处指所读取到的数据的内存缓冲. count:需要读取的数据量. 返回值:成功执行时,返回所读取的数据的字节数,一般等于或小于所请求读取的数据字节数.若已到文

Linux环境编程之文件I/O(八):文件链接

引言: 执行如下命令时, ls /usr/local/lib/libfreetype.so -l 显示内容: lrwxrwxrwx 1 root root 20 2014-04-06 22:57 /usr/local/lib/libfreetype.so -> libfreetype.so.6.9.0 表明这是一个链接文件,通过链接可以实现对一个文件从不同路径对它进行引用.对于文件的链接有硬链接和软连接(即符号链接)之分.shell中的ln命令可以创建一个文件的硬链接,加上-s选项可以创建一个文

Linux环境编程之共享内存区(一):共享内存区简介

Spark生态圈,也就是BDAS(伯克利数据分析栈),是伯克利APMLab实验室精心打造的,力图在算法(Algorithms).机器(Machines).人(People)之间通过大规模集成,来展现大数据应用的一个平台,其核心引擎就是Spark,其计算基础是弹性分布式数据集,也就是RDD.通过Spark生态圈,AMPLab运用大数据.云计算.通信等各种资源,以及各种灵活的技术方案,对海量不透明的数据进行甄别并转化为有用的信息,以供人们更好的理解世界.Spark生态圈已经涉及到机器学习.数据挖掘.