一.导学
1.1一个经典算法题
字符串匹配问题:
1)一个字符串str1="数据结构 与算法 数据结构与" 和另一个字符串str2 = "数据结构与"
2) 现让你判断str1是否包含str2,如果存在,就返回第一次出现的位置, 如果没有,则返回-1
3)并要求用最快的速度来完成匹配
4)请提供你的思路
当然,面对这些我们可以很容易的想到暴力匹配,即拿str2中的字符串一个一个的和str1中的相比.虽然能做出来,但好像违背了最快速度匹配的要求.
下面是我用Java实现的:
/**
* @author 十三
* @version 1.0
*/
public class Main {
public static void main(String[] args) {
String str1 = "数据结构 与算法 数据结构与";
String str2 = "数据结构与";
int position = Match(str1, str2);
if (position != -1) {
System.out.println("字符串str1包含字符串str2,第一次出现的位置是:" + position);
} else {
System.out.println("字符串str1不包含字符串str2");
}
}
public static int Match(String str1, String str2) {
int n = str1.length();
int m = str2.length();
for (int i = 0; i <= n - m; i++) {
int j;
for (j = 0; j < m; j++) {
if (str1.charAt(i + j) != str2.charAt(j)) {
break;
}
}
if (j == m) {
return i; // 匹配成功,返回第一次出现的位置
}
}
return -1; // 没有找到匹配的子串
}
}
结果展示:
这样的话,可以引出KMP算法.(这个是大二的时候学的一个算法后面复习到时会详细的写出见解)
上述是算法的一个导学案列.
1.2数据结构与算法的重要性
1)提高程序效率:数据结构与算法的设计可以帮助提高程序的执行效率。通过选择合适的数据结构和算法,可以减少程序的运行时间和空间复杂度,从而提高程序的执行速度和效率。
2)解决复杂问题:数据结构与算法提供了解决各种复杂问题的方法和工具。它们可以帮助组织和管理数据,处理和分析大量的信息,解决实际问题,如图像处理、自然语言处理、机器学习等。
3)优化资源利用:合理选择和使用数据结构与算法可以优化资源的利用。例如,在存储和检索大量数据时,合适的数据结构可以减少内存的占用和提高数据的访问效率。
4)提高代码质量:良好的数据结构与算法设计可以提高代码的可读性、可维护性和可扩展性。它们可以帮助我们组织代码逻辑,减少代码的重复性,提高代码的可重用性。
算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算(毕业面试的话肯定少不了数据结构与算法的提问)
1.3数据结构和算法的关系
1)数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构可以编写出更加漂亮,更加有效率的代码。
2)程序 = 数据结构 + 算法
3)数据结构是算法的基础, 换言之,想要学好算法,需要把数据结构学到位。
总之, 要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决.
1.3.1现实生活中遇到的问题
丢手帕问题(约瑟夫问题):
想必,这个游戏我们小时候或多或少都接触过,现在把它转换为代码实现,
即Josephu 问题:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表(单向环形链表),然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。当然现在只是先大概有个印象,后面会接触并解决它,今天只是导学.
二.小结
1)程序 = 数据结构 + 算法
2)数据结构和算法很重要!!!!