数组公式

代码本色+processing

好久不见. 提交于 2020-01-06 21:43:39
创意编程 实验要求 参考《代码本色》0-4章节,针对每个章节,编写5个习作。要求每个习作至少参考2个案例且必须有一定拓展。 本次作业按照规定要求认真学习书上相关内容,并运行浏览学习了每一段给出的范例代码。每一个习作都至少参考2个案例并且结合自己的想法加以拓展。 代码本色 第0章 引言 在这一章中介绍了随机和噪声,在书中介绍的原理我们看的很清楚,在随机游走的过程中有两种情况一个是有五种可能行走,一个是九种可能行走: 通过参考随机游走和噪声函数的学习我制作了一个可以随机游走且利用noise函数来实现颜色的变化: class Walker{ float x,y; float tx,ty; float r,b,g; float tr,tb,tg; Walker() { tx=0; ty=1000; tr=0; tb=200; tg=200; } void step() { x=map(noise(tx),0,1,0,width); y=map(noise(ty),0,1,0,height); tx+=0.01; ty+=0.01; } void c() //color { r=map(noise(tr),0,1,0,255); b=map(noise(tb),0,1,0,255); g=map(noise(tg),0,1,0,255); tr+=0.05; tb+=0.05; tg+=0

树状数组专题总结1

白昼怎懂夜的黑 提交于 2020-01-05 03:06:07
如果给定一个数组,要你求里面所有数的和,一般都会想到累加。但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了。所以我们就要用到树状数组,他的时间复杂度为O(lgn),相比之下就快得多。下面就讲一下什么是树状数组: 一般讲到树状数组都会少不了下面这个图: 下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4=a1+a2+a3+a4,c5=a5,c6=a5+a6,c7=a7,c8=a1+a2+a3+a4+a5+a6+a7+a8,c9=a9,c10=a9+a10,c11=a11........c16=a1+a2+a3+a4+a5+.......+a16。 分析上面的几组式子可知,当 i 为奇数时,ci=ai ;当 i 为偶数时,就要看 i 的因子中最多有二的多少次幂,例如,6 的因子中有 2 的一次幂,等于 2 ,所以 c6=a5+a6(由六向前数两个数的和),4 的因子中有 2 的两次幂,等于 4 ,所以 c4=a1+a2+a3+a4(由四向前数四个数的和)。 (一)有公式:cn=a(n-a^k+1)+.........+an(其中 k 为 n 的二进制表示中从右往左数的 0 的个数)。 那么,如何求 a^k 呢

Java排序之排序大综合

感情迁移 提交于 2020-01-01 14:57:05
一、最近写了一些排序,于是和和大家分享一下:(默认都是从小到大排序) 二、冒泡排序   1、什么是冒泡排序:原理是临近的两个数比较大小,将较大的数往后移,这样遍历一趟数组以后,最大的数就排在的最后面(时间复杂的为O(N2))    重复上面步骤N次。   2、原理描述:data{44,77,55,33,66}       第一次运行:data{44,55,33,66,77}       第二次运行:data{44,33,55,66,77}       。。。。。。       第N次执行:data{33,44,55,66,77}   3、参考代码: import java.util.Arrays; /** * Description:冒泡排序 * Author: Hey * Date: 2015/12/7 */ public class BubbleSort { public static void main(String[] args) { int[] data = {11, 66, 33, 44, 77, 55}; for (int i = 0; i < data.length-1; i++) { for (int j = data.length - i; j > 0; j--) { if (data[i] > data[i + 1]) { data[i] = data[i]

从零开始学算法(一)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-30 22:39:28
理解时间复杂度: 一个有序数组A,另一个无序数组B,请打印B中的所有不在A中的数,A数 组长度为N,B数组长度为M。 算法1:对于数组B中的每一个数,都在A中通过遍历的方式找一下; 算法2:对于数组B中的每一个数,都在A中通过二分的方式找一下; 算法3:先把数组B排序,然后用类似外排的方式打印所有不在A中出现的数; 时间复杂度分别为: O(M*N), O(M*log(N)),O(M*logM)+O(M+N) (算法3:排序O(M*logM),再加上两个有序数组各遍历一遍O(M+N)) 递归的算法的时间复杂度: 递归算法满足 master公式 :T(N) = aT(N/b)+T(N^d) 其中N是问题的样本量,a是拆分成子问题的数量,N/b是子问题的样本量,N^d是拆分后常规操作的复杂度。 log(b,a) > d ——> 时间复杂度: O(N^log(b,a)) log(b,a) = d ——> 时间复杂度: O(N^d*logN) log(b,a) < d ——> 时间复杂度: O(N^d)) 以归并排序为例,T(N)=2T(N/2)+T(N),a=2,b=2,d=1;log(1,1)=1,时间复杂度O(N*logN) 排序算法: 1.冒泡排序: 时间复杂度O(N^2),空间复杂度O(1) 相邻两个数比较,大的放在后面。每次遍历把最大的数找出放在最后。 for(int end

这些经典算法面试题你都不会的话,不要去应聘啦!

六月ゝ 毕业季﹏ 提交于 2019-12-30 14:24:52
1、一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。 function king($n, $m){ $monkeys = range(1, $n); //创建1到n数组 i = 0 ; w h i l e ( c o u n t ( i=0; while (count( i = 0 ; w h i l e ( c o u n t ( monkeys)>1) { //循环条件为猴子数量大于1 if(( i + 1 ) i+1)% i + 1 ) m==0) { // i 为 数 组 下 标 ; i为数组下标; i 为 数 组 下 标 ; i+1为猴子标号 unset( m o n k e y s [ monkeys[ m o n k e y s [ i]); //余数等于0表示正好第m个,删除,用unset删除保持下标关系 } else { array_push( m o n k e y s , monkeys, m o n k e y s , monkeys[ i ] ) ; / / 如 果 余 数 不 等 于 0 , 则 把 数 组 下 标 为 i]); /

深入理解HashMap

淺唱寂寞╮ 提交于 2019-12-30 12:11:10
1、为什么用HashMap? HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射 HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改 HashMap是非synchronized,所以HashMap很快 HashMap可以接受null键和值,而Hashtable则不能(原因就是equlas()方法需要对象,因为HashMap是后出的API经过处理才可以) 2、HashMap的工作原理是什么? HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来储存Node 对象。这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Node 。   以下是HashMap初始化 ,简单模拟数据结构 Node[] table=new Node[16] 散列桶初始化,table class Node { hash;//hash值 key;//键  value;//值  node next;//用于指向链表的下一层(产生冲突,用拉链法) }

堆排序原理

不打扰是莪最后的温柔 提交于 2019-12-30 04:25:11
1、什么是堆? 堆是一种 非线性结构 ,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被看作一个完全二叉树,通俗来讲 堆其实就是利用完全二叉树的结构来维护的一维数组 按照堆的特点可以把堆分为 大顶堆 和 小顶堆 大顶堆:每个结点的值都 大于 或 等于 其左右孩子结点的值 小顶堆:每个结点的值都 小于 或 等于 其左右孩子结点的值 (堆的这种特性非常的有用,堆常常被当做优先队列使用,因为可以快速的访问到“最重要”的元素) 2、堆的特点(数组实现) 我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子 我们用简单的公式来描述一下堆的定义就是:(读者可以对照上图的数组来理解下面两个公式) 大顶堆: arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆: arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 3、堆和普通树的区别 内存占用: 普通树占用的内存空间比它们存储的数据要多。你必须为节点对象以及左/右子节点指针分配额外的内存。堆仅仅使用数组,且不使用指针 (可以使用普通树来模拟堆,但空间浪费比较大,不太建议这么做) 平衡 : 二叉搜索树必须是“平衡”的情况下,其大部分操作的复杂度才能达到 O(nlog2n) 。你可以按任意顺序位置插入/删除数据,或者使用 AVL 树或者红黑树

(翻译)反射的第二部分:Emit

空扰寡人 提交于 2019-12-30 02:18:09
原文地址 作者:Mike Snell, Lars Powers 翻译:today 在我们之前的文章 , 反射的第一部分:发现和执行 里,我们已经介绍了 System.Reflection 命名空间及其包含的类,开发人员使用这些类可以查看程序集的元数据,并且可以在运行时查找和发现类型,甚至可以调用发现的代码。在这篇文章中,我们将探讨反射的高级功能: Emit ,它具有在运行时动态的产生代码的功效。 回顾反射 首先,让我们快速的回顾一下,什么是反射以及反射可以被用来做什么。从第一部分内容中,你已经知道,反射是在运行时发现对象的相关信息,并且执行这些对象(创建对象实例,执行对象上的方法)。这个功能是由 .NET 的 System.Reflection 命名空间的类所提供的。这些被用于类型发现和动态调用的类包括: Assembly , Module , ConstructorInfo , MethodInfo 以及其它。简单的说,它们不仅允许你浏览一个程序集暴露的类、方法、属性和字段,而且还允许你创建一个类型的实例以及执行这些类型上的方法(调用成员)。这些特性对于在运行时对象发现,已经很了不起了,但 .NET 的反射机制并没有到此结束。反射还允许你在运行时构建一个程序集,并且可以创建全新的类型。这就是反射发出( reflection emit )。 何谓反射发出( Reflection

HashMap和HashTable

倾然丶 夕夏残阳落幕 提交于 2019-12-28 03:07:00
JAVA的基础知识:数据结构(Map,List,Set等),设计模式,算法,线程相关,IO/NIO,序列化等等 其次是高级特征:反射机制,并发与锁,JVM(GC策略,类加载机制,内存模型)等等 举个例子 就比如问你:HashMap 是不是有序的? 你回答不是有序的。那面试官就会可能继续问你,有没有有序的Map实现类呢? 你如果这个时候说不知道的话,那这块问题就到此结束了。如果你说有TreeMap和LinkedHashMap。 那么面试官接下来就可能会问你,TreeMap和LinkedHashMap是如何保证它的顺序的? 如果你回答不上来,那么到此为止。 如果你说TreeMap是通过实现SortMap接口,能够把它保存的键值对根据key排序,基于红黑树,从而保证TreeMap中所有键值对处于有序状态。 LinkedHashMap则是通过插入排序(就是你put的时候的顺序是什么,取出来的时候就是什么样子)和访问排序(改变排序把访问过的放到底部)让键值有序。 1、为什么用HashMap? HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射 HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改 HashMap是非synchronized,所以HashMap很快 HashMap可以接受null键和值

数据结构与算法(2)--数组

允我心安 提交于 2019-12-27 03:16:53
引导 这一章节开始,正式进入数据结构与算法的学习过程中。由简到难,先开始学习最基础的数据结构–数组。 我相信对于数组,大家肯定是不陌生,因为数组在大多数的语言中都有,也是大家在编程中常常会接触到的。我不会说数组有多困难,但是它绝对不是像我们所想的那么简单而已。 带着问题进入今天的课题: 为什么数组的下表从0开始,而不是从1开始? 什么是数组 我们还是从专业的角度来介绍一下数组: 数组是一种 线性表 数据结构。它用一组 连续的内存空间 ,来储存一组 相同类型的数据 。其中有几个知识点是需要我们了解的。 第一点是闲心结构的概念。线性结构具有以下几个特点: 有唯一的首元素 有唯一的尾元素 除了首元素,所有的元素都有唯一的前驱 除了尾元素,所有的元素都有唯一的后继 数据元素之间存在“一对一”的关系 只要不满足以上特点的,就是非线性表。 常见的线性结构有:栈,数组,队列,堆,链表 常见的非线性结构有:树,图 第二点是连续的内存空间和相同类型的数据结构。这两点正是数据数组强大的主要原因–高效的访问操作(随机访问)。我们知道数组在查询操作中具有很高的效率。但是原因是什么呢?我们一起来分析一下。 例: 我们定义一个int 类型的数组,长度为10。假设首地址是base_address是1000。,那么它在内存中的分布应该如下图: 比如我现在要访问数组中第5个数据a[4] (数组下标从0开始)