当前位置: 首页 > 编程日记 > 正文

数据结构与算法:06 线性表

06 线性表

知识结构:

图1 知识结构


1. 线性表的定义与操作

1.1 线性表的定义

线性表(Linear List)是由n(n≥0)n (n≥0)n(n0)相同类型的数据元素a0,a1,⋯,an−1a_0,a_1,⋯,a_{n-1}a0,a1,,an1组成的序列。即表中除首尾元素外,其它元素有且仅有一个直接前驱和直接后继。首元素仅有一个直接后继,尾元素仅有一个直接前驱,记为:(a0,a1,⋯,an−1)(a_0,a_1,⋯,a_{n-1})(a0,a1,,an1)

表中数据元素的个数称为表的长度

例1:字母表

(a,b,c,d,…,z)(a,b,c,d,\dots,z)(a,b,c,d,,z)

例2:学生成绩表

1.2 线性表的操作

  • 随机存取:获取或设置指定索引处的数据元素值。(支持索引器)
  • 插入操作:将数据元素值插入到指定索引处。
  • 移除操作:移除线性表指定索引处的数据元素。
  • 查找操作:寻找具有特征值域的结点并返回其下标。
  • 得到表长:获取线性表中实际包含数据元素的个数。
  • 是否为空:判断线性表中是否包含数据元素。
  • 清空操作:移除线性表中的所有数据元素。

图2 线性表接口

using System;namespace LinearStruct
{/// <summary>/// 线性表的抽象数据类型/// </summary>/// <typeparam name="T">线性表中元素的类型</typeparam>public interface ILinearList<T> where T : IComparable<T>{/// <summary>/// 获取线性表中实际包含元素的个数/// </summary>int Length { get; }/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获取或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>T this[int index] { get; set; }/// <summary>/// 判断线性表中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>bool IsEmpty();/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>void Insert(int index, T data);/// <summary>/// 移除线性表指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>void Remove(int index);/// <summary>/// 在线性表中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>int Search(T data);/// <summary>/// 从线性表中移除所有元素/// </summary>void Clear();}
}

2. 线性表的顺序存储与实现

定义:利用顺序存储结构(即利用数组)实现的线性表,称为顺序表。

特点:逻辑结构与存储结构相同;具有随机存取的特点。

图3 顺序表存储示意图

实现:

图4 利用顺序存储结构实现线性表

using System;namespace LinearStruct
{/// <summary>/// 用顺序存储结构实现的线性表/// </summary>/// <typeparam name="T">顺序表中元素的类型</typeparam>public class SeqList<T> : ILinearList<T> where T : IComparable<T>{/// <summary>/// 数据集合/// </summary>protected readonly T[] Dataset;/// <summary>/// 获取SeqList中实际包含元素的个数/// </summary>public int Length { get; private set; }/// <summary>/// 获取SeqList中最多包含元素的个数/// </summary>public int MaxSize { get; }/// <summary>/// 初始化SeqList类的新实例/// </summary>/// <param name="max">SeqList中最多包含元素的个数</param>public SeqList(int max){if (max <= 0)throw new ArgumentOutOfRangeException();MaxSize = max;Dataset = new T[MaxSize];Length = 0;}/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获得或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>public T this[int index]{get{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();return Dataset[index];}set{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();Dataset[index] = value;}}/// <summary>/// 判断SeqList中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>public bool IsEmpty(){return Length == 0;}/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>public void Insert(int index, T data){if (index < 0 || index > Length)throw new IndexOutOfRangeException();if (Length == MaxSize)throw new Exception("达到最大值");for (int i = Length; i > index; i--){Dataset[i] = Dataset[i - 1];}Dataset[index] = data;Length++;}/// <summary>/// 移除SeqList指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>public void Remove(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();for (int i = index; i < Length - 1; i++){Dataset[i] = Dataset[i + 1];}Length--;}/// <summary>/// 在SeqList中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>public int Search(T data){int i;for (i = 0; i < Length; i++){if (Dataset[i].CompareTo(data) == 0)break;}return i == Length ? -1 : i;}/// <summary>/// 从SeqList中移除所有元素/// </summary>public void Clear(){Length = 0;}}
}

应用:

using System;
using LinearStruct;namespace ExampleList
{class Program{static void Main(string[] args){ListTest(new SeqList<string>(500));// 2// a1// a3}private static void ListTest(ILinearList<string> lst){lst.Insert(0, "a1");lst.Insert(1, "a2");lst.Insert(2, "a3");lst.Remove(1);Console.WriteLine(lst.Length);for (int i = 0; i < lst.Length; i++){Console.WriteLine(lst[i]);}}}
}

3. 线性表的链式存储与实现

利用指针方式实现的线性表称为链表(单链表、循环链表、双向链表)。它不要求逻辑上相邻的数据元素在物理位置上也相邻,即:逻辑结构与物理结构可以相同也可以不相同。

例3:将线性表(a3,a4,a5)(a_3,a_4,a_5)(a3,a4,a5)以链表的形式存储。

图5 利用链式方式存储数据元素

3.1 单链表

定义:每个结点只含有一个链域(指针域)的链表。即:利用单链域的方式存储线性表的逻辑结构。

结构:

图6 单链表存储结构

实现:

对结点的封装:

图7 对单链表结点的封装

using System;namespace LinearStruct
{/// <summary>/// 单链表结点/// </summary>/// <typeparam name="T">结点中数据元素的类型</typeparam>public class SNode<T> where T : IComparable<T>{/// <summary>/// 获取或设置该结点的数据元素/// </summary>public T Data { get; set; }/// <summary>/// 获取或设置该结点的后继结点/// </summary>public SNode<T> Next { get; set; }/// <summary>/// 初始化SNode类的新实例/// </summary>/// <param name="data">该结点的数据元素</param>/// <param name="next">该结点的后继结点</param>public SNode(T data, SNode<T> next = null){Data = data;Next = next;}}
}

对单链表的封装:

图8 对单链表的封装

using System;namespace LinearStruct
{/// <summary>/// 用链式存储结构实现的线性表--单链表/// </summary>/// <typeparam name="T">单链表中元素的类型</typeparam>public class SLinkList<T> : ILinearList<T> where T : IComparable<T>{/// <summary>/// 存储头结点/// </summary>protected SNode<T> PHead { get; set; }/// <summary>/// 获取SLinkList中实际包含元素的个数/// </summary>public int Length { get; private set; }/// <summary>/// 初始化SLinkList类的新实例/// </summary>public SLinkList(){Length = 0;PHead = null;}/// <summary>/// 将元素插入到单链表的首部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtFirst(T data){PHead = new SNode<T>(data, PHead);Length++;}/// <summary>/// 获得指定索引处的结点/// </summary>/// <param name="index">元素从零开始的索引</param>/// <returns>指定索引处的结点</returns>private SNode<T> Locate(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();SNode<T> temp = PHead;for (int i = 0; i < index; i++){temp = temp.Next;}return temp;}/// <summary>/// 将元素插入到单链表的尾部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtRear(T data){if (PHead == null){PHead = new SNode<T>(data);}else{Locate(Length - 1).Next = new SNode<T>(data);}Length++;}/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获得或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>public T this[int index]{get{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();return Locate(index).Data;}set{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();Locate(index).Data = value;}}/// <summary>/// 判断SLinkList中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>public bool IsEmpty(){return Length == 0;}/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>public void Insert(int index, T data){if (index < 0 || index > Length)throw new IndexOutOfRangeException();if (index == 0){InsertAtFirst(data);}else if (index == Length){InsertAtRear(data);}else{SNode<T> temp = Locate(index - 1);temp.Next = new SNode<T>(data, temp.Next);Length++;}}/// <summary>/// 移除SLinkList指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>public void Remove(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();if (index == 0){PHead = PHead.Next;}else{SNode<T> temp = Locate(index - 1);temp.Next = temp.Next.Next;}Length--;}/// <summary>/// 在SLinkList中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>public int Search(T data){int i;SNode<T> temp = PHead;for (i = 0; i < Length; i++){if (temp.Data.CompareTo(data) == 0)break;temp = temp.Next;}return i == Length ? -1 : i;}/// <summary>/// 从SLinkList中移除所有元素/// </summary>public void Clear(){PHead = null;Length = 0;}}
}

应用:

using System;
using LinearStruct;namespace ExampleList
{class Program{static void Main(string[] args){ListTest(new SLinkList<string>());// 2// a1// a3}private static void ListTest(ILinearList<string> lst){lst.Insert(0, "a1");lst.Insert(1, "a2");lst.Insert(2, "a3");lst.Remove(1);Console.WriteLine(lst.Length);for (int i = 0; i < lst.Length; i++){Console.WriteLine(lst[i]);}}}
}

3.2 循环链表

定义:是一种首尾相连的单链表。即:在单链表中,将尾结点的指针域null改为指向PHead,就得到单链形式的循环链表。

表现形式:

图9 利用头指针表示循环链表

通常情况下,使用尾指针表示循环链表。

图10 利用尾指针表示循环链表

实现:

对循环链表的封装:

图11 对循环链表的封装

using System;namespace LinearStruct
{/// <summary>/// 用链式存储结构实现的线性表--循环链表/// </summary>/// <typeparam name="T">循环链表中元素的类型</typeparam>public class CLinkList<T> : ILinearList<T> where T : IComparable<T>{/// <summary>/// 存储尾部结点/// </summary>protected SNode<T> PRear { get; set; }/// <summary>/// 获取CLinkList中实际包含元素的个数/// </summary>public int Length { get; private set; }/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获得或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>public T this[int index]{get{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();return Locate(index).Data;}set{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();Locate(index).Data = value;}}/// <summary>/// 初始化CLinkList类的新实例/// </summary>public CLinkList(){Length = 0;PRear = null;}/// <summary>/// 判断CLinkList中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>public bool IsEmpty(){return Length == 0;}/// <summary>/// 将元素插入到循环链表的尾部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtRear(T data){if (IsEmpty()){PRear = new SNode<T>(data);PRear.Next = PRear;}else{SNode<T> temp = new SNode<T>(data, PRear.Next);PRear.Next = temp;PRear = temp;}Length++;}/// <summary>/// 将元素插入到循环链表的首部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtFirst(T data){if (IsEmpty()){PRear = new SNode<T>(data);PRear.Next = PRear;}else{SNode<T> temp = new SNode<T>(data, PRear.Next);PRear.Next = temp;}Length++;}/// <summary>/// 获得指定索引处的结点/// </summary>/// <param name="index">元素从零开始的索引</param>/// <returns>指定索引处的结点</returns>private SNode<T> Locate(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();SNode<T> temp = PRear.Next;for (int i = 0; i < index; i++){temp = temp.Next;}return temp;}/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>public void Insert(int index, T data){if (index < 0 || index > Length)throw new IndexOutOfRangeException();if (index == 0){InsertAtFirst(data);}else if (index == Length){InsertAtRear(data);}else{SNode<T> temp = Locate(index - 1);temp.Next = new SNode<T>(data, temp.Next);Length++;}}/// <summary>/// 移除CLinkList指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>public void Remove(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();if (PRear == PRear.Next){PRear = null;}else{if (index == Length - 1){SNode<T> temp = Locate(Length - 2);temp.Next = PRear.Next;PRear = temp;}else if (index == 0){PRear.Next = PRear.Next.Next;}else{SNode<T> temp = Locate(index - 1);temp.Next = temp.Next.Next;}}Length--;}/// <summary>/// 在CLinkList中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>public int Search(T data){int i;SNode<T> temp = PRear;for (i = 0; i < Length; i++){if (temp.Next.Data.CompareTo(data) == 0)break;temp = temp.Next;}return (i == Length) ? -1 : i;}/// <summary>/// 从CLinkList中移除所有元素/// </summary>public void Clear(){Length = 0;PRear = null;}}
}

应用:

using System;
using LinearStruct;namespace ExampleList
{class Program{static void Main(string[] args){ListTest(new CLinkList<string>());// 2// a1// a3}private static void ListTest(ILinearList<string> lst){lst.Insert(0, "a1");lst.Insert(1, "a2");lst.Insert(2, "a3");lst.Remove(1);Console.WriteLine(lst.Length);for (int i = 0; i < lst.Length; i++){Console.WriteLine(lst[i]);}}}
}

3.3 双向链表

定义:每个结点含有两个链域(指针域)的链表。即:利用双链域的方式存储线性表的逻辑结构。

结构:

图12 双链表存储结构

实现:

对结点的封装:

图13 对双链表结点的封装

using System;namespace LinearStruct
{/// <summary>/// 双向链表结点/// </summary>/// <typeparam name="T">结点中数据元素的类型</typeparam>public class DNode<T> where T : IComparable<T>{/// <summary>/// 获取或设置该结点的前趋结点/// </summary>public DNode<T> Prior { get; set; }/// <summary>/// 获取或设置该结点的后继结点/// </summary>public DNode<T> Next { get; set; }/// <summary>/// 获取或设置该结点的数据元素/// </summary>public T Data { get; set; }/// <summary>/// 初始化DNode类的新实例/// </summary>/// <param name="data">该结点的数据元素</param>/// <param name="prior">该结点的前趋结点</param>/// <param name="next">该结点的后继结点</param>public DNode(T data, DNode<T> prior = null, DNode<T> next = null){Prior = prior;Data = data;Next = next;}}
}

对双向链表的封装:

图14 对双向链表的封装

using System;namespace LinearStruct
{/// <summary>/// 用链式存储结构实现的线性表--双链表/// </summary>/// <typeparam name="T">结点中数据元素的类型</typeparam>public class DLinkList<T> : ILinearList<T> where T : IComparable<T>{/// <summary>/// 存储头结点/// </summary>protected DNode<T> PHead { get; set; }/// <summary>/// 存储尾结点/// </summary>protected DNode<T> PRear { get; set; }/// <summary>/// 获取DLinkList中实际包含元素的个数/// </summary>public int Length { get; private set; }/// <summary>/// 初始化DLinkList类的新实例/// </summary>public DLinkList(){PHead = null;PRear = null;Length = 0;}/// <summary>/// 将元素插入到双链表的首部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtFirst(T data){if (IsEmpty()){DNode<T> temp = new DNode<T>(data);PHead = temp;PRear = temp;}else{DNode<T> temp = new DNode<T>(data, null, PHead);PHead.Prior = temp;PHead = temp;}Length++;}/// <summary>/// 将元素插入到双链表的尾部/// </summary>/// <param name="data">要插入的元素</param>public void InsertAtRear(T data){if (IsEmpty()){DNode<T> temp = new DNode<T>(data);PHead = temp;PRear = temp;}else{DNode<T> temp = new DNode<T>(data, PRear, null);PRear.Next = temp;PRear = temp;}Length++;}/// <summary>/// 获得指定索引处的结点/// </summary>/// <param name="index">元素从零开始的索引</param>/// <returns>指定索引处的结点</returns>private DNode<T> Locate(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();DNode<T> temp = PHead;for (int i = 0; i < index; i++){temp = temp.Next;}return temp;}/// <summary>/// 将元素插入到指定索引处/// </summary>/// <param name="index">从零开始的索引,应在该位置插入data.</param>/// <param name="data">要插入的元素</param>public void Insert(int index, T data){if (index < 0 || index > Length)throw new IndexOutOfRangeException();if (index == 0){InsertAtFirst(data);}else if (index == Length){InsertAtRear(data);}else{DNode<T> temp1 = Locate(index);DNode<T> temp2 = new DNode<T>(data, temp1.Prior, temp1);temp2.Prior.Next = temp2;temp2.Next.Prior = temp2;Length++;}}/// <summary>/// 移除DLinkList指定索引处的元素/// </summary>/// <param name="index">要移除元素从0开始的索引</param>public void Remove(int index){if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();if (Length == 1){PHead = null;PRear = null;}else{if (index == 0){PHead = PHead.Next;PHead.Prior = null;}else if (index == Length - 1){PRear = PRear.Prior;PRear.Next = null;}else{DNode<T> temp = Locate(index);temp.Prior.Next = temp.Next;temp.Next.Prior = temp.Prior;}}Length--;}/// <summary>/// 判断DLinkList中是否包含元素/// </summary>/// <returns>如果包含元素返回false,否则返回true.</returns>public bool IsEmpty(){return Length == 0;}/// <summary>///  从DLinkList中移除所有元素/// </summary>public void Clear(){Length = 0;PHead = null;PRear = null;}/// <summary>/// 在DLinkList中寻找元素data./// </summary>/// <param name="data">要寻找的元素</param>/// <returns>如果存在返回该元素在线性表中的位置,否则返回-1.</returns>public int Search(T data){int i;DNode<T> temp = PHead;for (i = 0; i < Length; i++){if (temp.Data.CompareTo(data) == 0)break;temp = temp.Next;}return i == Length ? -1 : i;}/// <summary>/// 获取或设置指定索引处的元素/// </summary>/// <param name="index">要获得或设置的元素从零开始的索引</param>/// <returns>指定索引处的元素</returns>public T this[int index]{get{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();return Locate(index).Data;}set{if (index < 0 || index > Length - 1)throw new IndexOutOfRangeException();Locate(index).Data = value;}}}
}

应用:

using System;
using LinearStruct;namespace ExampleList
{class Program{static void Main(string[] args){ListTest(new DLinkList<string>());// 2// a1// a3}private static void ListTest(ILinearList<string> lst){lst.Insert(0, "a1");lst.Insert(1, "a2");lst.Insert(2, "a3");lst.Remove(1);Console.WriteLine(lst.Length);for (int i = 0; i < lst.Length; i++){Console.WriteLine(lst[i]);}}}
}

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:



相关文章:

MySQL提权简单方法

前不久网上公开了一个MySQL Func的漏洞,讲的是使用MySQL创建一个自定义的函数,然后通过这个函数来攻击服务器。最早看到相关的报道是在o-otik上,但是公布的是针对 Unix系统的Exploit,并且成功率也不是很高.而近期,国内有高手放出针对Win系统的相关文章,于是我马上找来与朋友一同…

转载LINQ优点 自己学习用的

这几天在读一本LINQ方面的书《Essential LINQ》,在这里和大家分享下。 由于对LINQ的深入总结需要大量的篇幅&#xff0c;因此在这里分成几个部分来讲。 &#xff08;*我看《Essential LINQ》是英文版的&#xff0c;有些名词不能翻译成正统的中文解释请给予谅解&#xff09; LIN…

什么是Python?好学吗?

互联网IT行业是很多人都比较关注的行业&#xff0c;大部分都想学习IT技术进入到这个行业&#xff0c;Python编程语言在近几年是多数人的选择&#xff0c;那么什么是Python?好学吗?具体来看看下面的详细介绍吧。 一、什么是python 网络上对python的解释是一门解释型、面向对象…

数据结构与算法:07 Leetcode同步练习(二)

目录 题目01&#xff1a;回文数题目02&#xff1a;x 的平方根题目03&#xff1a;爬楼梯题目04&#xff1a;买卖股票的最佳时机题目05&#xff1a;买卖股票的最佳时机 II题目06&#xff1a;跳跃游戏题目07&#xff1a;三数之和题目08&#xff1a;最接近的三数之和题目09&#x…

(五)Docker镜像和容器

之所以在之前没有讲什么是镜像和容器是因为如果你没有一个最初的认识&#xff0c;那么你就很难理解镜像和容器以及它们的区别。我相信在前面一章中的讲述中&#xff0c;你应该稍有体会容器是基于镜像构建的&#xff0c;同时构建了容器之后如果不删除就会一直存在&#xff0c;而…

翻译-高质量JavaScript代码书写基本要点(转载)

by zhangxinxu from http://www.zhangxinxu.com本文地址&#xff1a;http://www.zhangxinxu.com/wordpress/?p1173 原文作者&#xff1a;Stoyan Stefanov原文链接&#xff1a;The Essentials of Writing High Quality JavaScript 翻译编辑&#xff1a;张鑫旭//zxx: 俗不可耐的…

学习ui设计的流程是什么

UI设计在如今的市场行情中是很多企业都必不可少的一个技术岗位&#xff0c;UI设计是比较注重自身产品的用户体验的&#xff0c;想要学习UI设计&#xff0c;一定要做足功课&#xff0c;下面小编就为大家详细的介绍一下学习ui设计的流程是什么? 学习ui设计的流程是什么?总体进程…

数据结构与算法:08 Leetcode同步练习(三)

目录 题目01&#xff1a;合并两个有序链表题目02&#xff1a;删除排序链表中的重复元素题目03&#xff1a;环形链表题目04&#xff1a;反转链表题目05&#xff1a;删除链表中的节点题目06&#xff1a;两数相加题目07&#xff1a;删除链表的倒数第N个节点题目08&#xff1a;两两…

Linux之进程管理

程序是保存在外部存储设备&#xff08;如硬盘&#xff09;中的可执行机器代码和数据的集合。而进程是在CPU及内存中处于动态执行状态的计算机程序。每个程序启动后会产生一个或多个进程&#xff0c;如httpd程序&#xff0c;当有大量用户访问Web页面时&#xff0c;httpd程序会产…

win8 metro 拖拽重排grid

0.1 http://1.metrowin8.sinaapp.com/Code/index.html 拖拽重排实现思路 &#xff1a; 1.初始化拖拽对象时&#xff0c;上传拖拽对象中心点信息(包括id,className) 2.鼠标按下时&#xff0c;制造一个假的拖拽对象 3.鼠标放开时&#xff0c;计算鼠标与拖拽对象中心点的距离&…

什么是AngularJS?它有哪些特性?

AngulaJS是款非常优秀的JasSetpsn结构化框架,可以用来构建单页面应用程序&#xff0c;2009年,AngularJS由Misko Hevery等人创建&#xff0c;后来被Google收购&#xff0c;该技术已经被用于Coogle旗下的多款产品开发当中。开发人员不仅可以使用和扩展HTML语言的特性。而且可以更…

ELK安装文档及相关优化

前言&#xff1a;随着硬件成本的不断低廉&#xff0c;我们可以存储更多数据内容&#xff0c;也会对各数据加以利用&#xff0c;其中一项很重要的数据内容便是日志文件&#xff0c;无论是访问日志还是系统日志或是应用日志&#xff0c;都显得十分重要&#xff0c;而怎么加以利用…

数据结构与算法:09 栈与递归

09 栈与递归 知识结构&#xff1a; 栈是我们经常使用的一种数据结构&#xff0c;比如&#xff0c;手枪发射子弹的顺序与子弹压入弹夹的顺序是相反&#xff0c;即后压入弹夹的子弹先发射出来。又比如&#xff0c;我们使用的Word、Excel、Photoshop等软件系统中的撤销操作&#…

Javascript匿名函数

定义 匿名函数的定义非常简单&#xff1a;就是没有名字的函数。但是其用途非常的大 典型的函数定义方式 在看匿名函数之前我们先看下在Javascript中定义一个函数比较典型的几种方式 函数声明 function functionName(args) { //函数体 } 函数表达式 var functionName functi…

零基础学Java大数据难不难

java大数据如今在企业中用到的次数是非常多的&#xff0c;很多人都比较看好java技术&#xff0c;那么零基础学Java大数据难不难?想要学习java技术说难不难&#xff0c;说简单也不是很简单&#xff0c;来看看下面的详细介绍就知道了。 零基础学Java大数据难不难?因人而异&…

技术图文:01 面向对象设计原则

01 面向对象设计原则 知识结构&#xff1a; 一碟开胃的小菜 小菜今年计算机专业大四了&#xff0c;学了不少软件开发方面的东西&#xff0c;也学着编了些小程序&#xff0c;踌躇满志&#xff0c;一心要找一个好单位。当投递了无数简历后&#xff0c;终于收到了一个单位的面试…

关于GridView手动绑定的一段代码,一切尽在不言中

为GridView绑定主键的方法&#xff0c;在前台的DataGrid标签中加 DataKeyNames"ID" 后台获取ID&#xff1a; int idint.parse(this.GridView.DataKeys[e.RowIndex].Value.Tostring()); 如果DataKeyNames绑定了多个列取法&#xff1a;int idint.parse(this.G…

linux 服务器FTP服务安装教程

1.更新yum源 首先需要更新系统的yum源&#xff0c;便捷工具下载地址&#xff1a;http://help.aliyun.com/manual?spm0.0.0.0.zJ3dBU&helpId1692 2.安装vsftp 使用yum命令安装vsftp #yum install vsftpd -y 3.添加ftp帐号和目录 先检查一下nologin的位置&#xff0c;通常在…

CSS3颜色不透明度如何设置

web前端技术包含HTML和CSS样式&#xff0c;两者是相辅相成的&#xff0c;学习CSS样式不必可少&#xff0c;那么在学习CSS样式中&#xff0c;CSS3颜色不透明度如何设置?在CSS3之前&#xff0c;我们设置颜色的方式包含十六进制颜色(如#F00)、rgb模式颜色、或指定颜色的英文名称(…

技术图文:02 创建型设计模式(上)

创建型设计模式&#xff08;上&#xff09; 知识结构&#xff1a; 图1 知识结构 简单工厂模式 Sunny 软件公司欲基于 C# 语言开发一套图表库&#xff0c;该图表库可以为应用系统提供各种不同外观的图表&#xff0c;如&#xff1a; 柱状图&#xff08;histogram&#xff09;饼…

转:初探 jQuery 的 Sizzle 选择器

这是一篇关于介绍jQuery Sizzle选择器的文章&#xff0c;由我和obility共同完成。在文中&#xff0c;我们试图用自己的语言配以适量的代码向读者展现出Sizzle在处理选择符时的流程原理&#xff0c;以及末了以少许文字给你展示出如何借用Sizzle之手实现自定义选择器&#xff08;…

安装hadoop图文

1.下载hadoop-2.5.1,存放根目录 2.通过tar -zxvf 包名 来进行解压 3.通过mv命令将解压后的hadoop包移动到/home下 4.修改hadoop-en.sh配置文件,添加jdk的安装目录,操作如下图所示 5.修改core-site.xml配置文件,添加namenode的配置信息 6.修改hdfs-site.xml配置文件,添加seconda…

Java中父类方法重写有哪些需要注意的?

在继承关系中&#xff0c;子类会自动继承父类中公共的方法&#xff0c;但有时在子类中需要对继承的方法进行一些修改&#xff0c;即对父类的方法进行重写。需要注意的是&#xff0c;子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。 在上一节…

技术图文:02 创建型设计模式(下)

创建型设计模式&#xff08;下&#xff09; 知识结构&#xff1a; 图1 知识结构 单例模式 – 确保对象的唯一性 Sunny 软件公司承接了一个服务器负载均衡软件的开发工作&#xff0c;该软件运行在一台负载均衡服务器上&#xff0c;可以将并发访问和数据流量分发到服务器集群中…

[转载]C# 二进制与十进制,十进制与十六进制相互转换

原文地址&#xff1a;C# 二进制与十进制,十进制与十六进制相互转换作者&#xff1a;tonytonglx十进制转二进制&#xff1a;用2辗转相除至结果为1 将余数和最后的1从下向上倒序写就是结果例如302302/2 151 余0151/2 75 余175/2 37 余137/2 18 余118/2 9 余09/2 4 余14/2 …

感知哈希算法——找出相似的图片

参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格式), 两张图片的指纹越相似, 说明两张图片就越相似. 但关键是如何根据图片计算出"指纹"呢? 下面用最简单的步…

学web前端需要了解哪些常识

想要学好web前端技术&#xff0c;那么一定要掌握足够的知识&#xff0c;web前端技术包含很多方面的知识&#xff0c;具体学web前端需要了解哪些常识?来看看下面的详细介绍。 学web前端需要了解哪些常识? html css javascript。 要学的内容实在很多&#xff0c;如果没有其他编…

linux下后台执行shell脚本

一句话 nohup sh startup_Server.sh & 转载于:https://www.cnblogs.com/phpcode/archive/2012/04/24/2522761.html

线性代数:第一章 线性方程组

本讲义是自己上课所用幻灯片&#xff0c;里面没有详细的推导过程&#xff08;笔者板书推导&#xff09;只以大纲的方式来展示课上的内容&#xff0c;以方便大家下来复习。 从本章开始&#xff0c;我们一起来学习线性代数的有关知识&#xff0c;线性代数的应用之一就是求解复杂…

菜鸟也来学习ORACLE(1)_linux下安装oracle 11g

加入 oracle Club 之前&#xff0c;学长给我们开了个小会 说是看看我们加入的意愿&#xff0c;哎哎 其实直无聊&#xff0c;但是大体比较重视linux 服务器的搭建 以及在linux 下安装oracle 搭建一个oracle 环境吧、我就想这东西能有多难&#xff0c;于是回来就搭建起了&#x…