Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add JavaScript and TypeScript code and docs for Section Space Complexity #331

Merged
merged 7 commits into from Feb 5, 2023
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 5 additions & 5 deletions codes/javascript/chapter_array_and_linkedlist/linked_list.js
Expand Up @@ -4,8 +4,8 @@
* Author: IsChristina (christinaxia77@foxmail.com), Justin (xiefahit@gmail.com)
*/

const PrintUtil = require("../include/PrintUtil");
const ListNode = require("../include/ListNode");
const { printLinkedList } = require("../include/PrintUtil");
const { ListNode } = require("../include/ListNode");

/* 在链表的结点 n0 之后插入结点 P */
function insert(n0, P) {
Expand Down Expand Up @@ -62,17 +62,17 @@ n1.next = n2;
n2.next = n3;
n3.next = n4;
console.log("初始化的链表为");
PrintUtil.printLinkedList(n0);
printLinkedList(n0);

/* 插入结点 */
insert(n0, new ListNode(0));
console.log("插入结点后的链表为");
PrintUtil.printLinkedList(n0);
printLinkedList(n0);

/* 删除结点 */
remove(n0);
console.log("删除结点后的链表为");
PrintUtil.printLinkedList(n0);
printLinkedList(n0);

/* 访问结点 */
const node = access(n0, 3);
Expand Down
101 changes: 101 additions & 0 deletions codes/javascript/chapter_computational_complexity/space_complexity.js
@@ -0,0 +1,101 @@
/**
* File: space_complexity.js
* Created Time: 2023-02-05
* Author: Justin (xiefahit@gmail.com)
*/

const { ListNode } = require('../include/ListNode');
const { TreeNode } = require('../include/TreeNode');
const { printTree } = require('../include/PrintUtil');

/* 函数 */
function constFunc() {
// do something
return 0;
}

/* 常数阶 */
function constant(n) {
// 常量、变量、对象占用 O(1) 空间
const a = 0;
const b = 0;
const nums = new Array(10000);
const node = new ListNode(0);
// 循环中的变量占用 O(1) 空间
for (let i = 0; i < n; i++) {
const c = 0;
}
// 循环中的函数占用 O(1) 空间
for (let i = 0; i < n; i++) {
constFunc();
}
}

/* 线性阶 */
function linear(n) {
// 长度为 n 的数组占用 O(n) 空间
const nums = new Array(n);
// 长度为 n 的列表占用 O(n) 空间
const nodes = [];
for (let i = 0; i < n; i++) {
nodes.push(new ListNode(i));
}
// 长度为 n 的哈希表占用 O(n) 空间
const map = new Map();
for (let i = 0; i < n; i++) {
map.set(i, i.toString());
}
}

/* 线性阶(递归实现) */
function linearRecur(n) {
console.log(`递归 n = ${n}`);
if (n === 1) return;
linearRecur(n - 1);
}

/* 平方阶 */
function quadratic(n) {
// 矩阵占用 O(n^2) 空间
const numMatrix = Array(n).fill(null).map(() => Array(n).fill(null));
// 二维列表占用 O(n^2) 空间
const numList = [];
for (let i = 0; i < n; i++) {
const tmp = [];
for (let j = 0; j < n; j++) {
tmp.push(0);
}
numList.push(tmp);
}
}

/* 平方阶(递归实现) */
function quadraticRecur(n) {
if (n <= 0) return 0;
const nums = new Array(n);
console.log(`递归 n = ${n} 中的 nums 长度 = ${nums.length}`);
return quadraticRecur(n - 1);
}

/* 指数阶(建立满二叉树) */
function buildTree(n) {
if (n === 0) return null;
const root = new TreeNode(0);
root.left = buildTree(n - 1);
root.right = buildTree(n - 1);
return root;
}

/* Driver Code */
const n = 5;
// 常数阶
constant(n);
// 线性阶
linear(n);
linearRecur(n);
// 平方阶
quadratic(n);
quadraticRecur(n);
// 指数阶
const root = buildTree(n);
printTree(root);
Expand Up @@ -13,8 +13,8 @@ function randomNumbers(n) {
}
// 随机打乱数组元素
for (let i = 0; i < n; i++) {
let r = Math.floor(Math.random() * (i + 1));
let temp = nums[i];
const r = Math.floor(Math.random() * (i + 1));
const temp = nums[i];
nums[i] = nums[r];
nums[r] = temp;
}
Expand All @@ -34,14 +34,12 @@ function findOne(nums) {
}

/* Driver Code */
function main() {
for (let i = 0; i < 10; i++) {
let n = 100;
let nums = randomNumbers(n);
let index = findOne(nums);
console.log(
"\n数组 [ 1, 2, ..., n ] 被打乱后 = [" + nums.join(", ") + "]"
);
console.log("数字 1 的索引为 " + index);
}
for (let i = 0; i < 10; i++) {
const n = 100;
const nums = randomNumbers(n);
const index = findOne(nums);
console.log(
"\n数组 [ 1, 2, ..., n ] 被打乱后 = [" + nums.join(", ") + "]"
);
console.log("数字 1 的索引为 " + index);
}
52 changes: 23 additions & 29 deletions codes/javascript/chapter_searching/hashing_search.js
Expand Up @@ -4,48 +4,42 @@
* Author: Zhuo Qinyue (1403450829@qq.com)
*/

const PrintUtil = require("../include/PrintUtil");
const ListNode = require("../include/ListNode");

const { ListNode, arrToLinkedList } = require("../include/ListNode");

/* 哈希查找(数组) */
function hashingSearch(map, target) {
function hashingSearchArray(map, target) {
// 哈希表的 key: 目标元素,value: 索引
// 若哈希表中无此 key ,返回 -1
return map.has(target) ? map.get(target) : -1;
}

/* 哈希查找(链表) */
function hashingSearch1(map, target) {
function hashingSearchLinkedList(map, target) {
// 哈希表的 key: 目标结点值,value: 结点对象
// 若哈希表中无此 key ,返回 null
return map.has(target) ? map.get(target) : null;
}

function main() {
const target = 3;

/* 哈希查找(数组) */
const nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8];
// 初始化哈希表
const map = new Map();
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], i); // key: 元素,value: 索引
}
const index = hashingSearch(map, target);
console.log("目标元素 3 的索引 = " + index);
/* Driver Code */
const target = 3;

/* 哈希查找(链表) */
let head = new ListNode().arrToLinkedList(nums)
// 初始化哈希表
const map1 = new Map();
while (head != null) {
map1.set(head.val, head); // key: 结点值,value: 结点
head = head.next;
}
const node = hashingSearch1(map1, target);
console.log("目标结点值 3 的对应结点对象为" );
PrintUtil.printLinkedList(node);
/* 哈希查找(数组) */
const nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8];
// 初始化哈希表
const map = new Map();
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], i); // key: 元素,value: 索引
}
const index = hashingSearchArray(map, target);
console.log("目标元素 3 的索引 = " + index);

main();
/* 哈希查找(链表) */
let head = arrToLinkedList(nums)
// 初始化哈希表
const map1 = new Map();
while (head != null) {
map1.set(head.val, head); // key: 结点值,value: 结点
head = head.next;
}
const node = hashingSearchLinkedList(map1, target);
console.log("目标结点值 3 的对应结点对象为", node);
15 changes: 7 additions & 8 deletions codes/javascript/chapter_searching/linear_search.js
Expand Up @@ -4,7 +4,7 @@
* Author: JoseHung (szhong@link.cuhk.edu.hk)
*/

const ListNode = require("../include/ListNode");
const { ListNode, arrToLinkedList } = require("../include/ListNode");

/* 线性查找(数组) */
function linearSearchArray(nums, target) {
Expand Down Expand Up @@ -34,15 +34,14 @@ function linearSearchLinkedList(head, target) {
}

/* Driver Code */
var target = 3;
const target = 3;

/* 在数组中执行线性查找 */
var nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8];
var index = linearSearchArray(nums, target);
const nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8];
const index = linearSearchArray(nums, target);
console.log("目标元素 3 的索引 = " + index);

/* 在链表中执行线性查找 */
var linkedList = new ListNode();
var head = linkedList.arrToLinkedList(nums);
var node = linearSearchLinkedList(head, target);
console.log("目标结点值 3 的对应结点对象为 " + node);
const head = arrToLinkedList(nums);
const node = linearSearchLinkedList(head, target);
console.log("目标结点值 3 的对应结点对象为 ", node);
6 changes: 4 additions & 2 deletions codes/javascript/chapter_stack_and_queue/array_queue.js
Expand Up @@ -31,8 +31,10 @@ class ArrayQueue {

/* 入队 */
push(num) {
if (this.size == this.capacity)
throw new Error("队列已满");
if (this.size == this.capacity) {
console.log("队列已满");
return;
}
// 计算尾指针,指向队尾索引 + 1
// 通过取余操作,实现 rear 越过数组尾部后回到头部
const rear = (this.#front + this.size) % this.capacity;
Expand Down
Expand Up @@ -4,7 +4,7 @@
* Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com)
*/

const ListNode = require("../include/ListNode");
const { ListNode } = require("../include/ListNode");

/* 基于链表实现的队列 */
class LinkedListQueue {
Expand Down
Expand Up @@ -4,7 +4,7 @@
* Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com)
*/

const ListNode = require("../include/ListNode");
const { ListNode } = require("../include/ListNode");

/* 基于链表实现的栈 */
class LinkedListStack {
Expand Down
60 changes: 32 additions & 28 deletions codes/javascript/include/ListNode.js
Expand Up @@ -11,37 +11,41 @@ class ListNode {
val;
next;
constructor(val, next) {
this.val = (val === undefined ? 0 : val);
this.next = (next === undefined ? null : next);
this.val = (val === undefined ? 0 : val);
this.next = (next === undefined ? null : next);
}

/**
* Generate a linked list with an array
* @param arr
* @return
*/
arrToLinkedList(arr) {
const dum = new ListNode(0);
let head = dum;
for (const val of arr) {
head.next = new ListNode(val);
head = head.next;
}
return dum.next;
}

/**
* Generate a linked list with an array
* @param arr
* @return
*/
function arrToLinkedList(arr) {
const dum = new ListNode(0);
let head = dum;
for (const val of arr) {
head.next = new ListNode(val);
head = head.next;
}
return dum.next;
}

/**
* Get a list node with specific value from a linked list
* @param head
* @param val
* @return
*/
getListNode(head, val) {
while (head !== null && head.val !== val) {
head = head.next;
}
return head;
/**
* Get a list node with specific value from a linked list
* @param head
* @param val
* @return
*/
function getListNode(head, val) {
while (head !== null && head.val !== val) {
head = head.next;
}
return head;
}

module.exports = ListNode
module.exports = {
ListNode,
arrToLinkedList,
getListNode
};